1

如果我在 Linux 下使用库创建线程Pthread,我需要使用 functionpthread_create作为它需要的参数之一void *,所以我可以传递一个指向某物的指针,这样我的线程例程就可以访问它,但是做类似的事情是否安全这个

{//some scope
    int a=5//scope variable
    pthread_create(&id,NULL,some_function,(void*)a);
}//end of scope

在我的日常生活中:

void *some_function(void *_arg)
{
    int a=(int)arg;
    return NULL;
}

我想做这样的事情,所以我可以将变量的值保留在堆栈上,这样我就可以从我的线程例程中访问它,但我不想为单个变量创建结构或手动分配内存。

我将创建几个这样的线程,所以我想知道在这种情况下我是否可以通过并且不使用列表或动态数组。

4

2 回答 2

4

你所做的在现实世界中是完全安全的:在int和之间的转换void *不是未定义的行为,它是实现定义的,所有实现都以自然、理智的方式定义它。这也是将单整数参数传递给新线程的唯一有效方法。其他方法都需要昂贵的同步,要么通过显式锁定,要么malloc在原始线程和新线程中使用(在/实现free中隐藏了隐式同步成本)。mallocfree

但是,您会发现一件事是某些编译器会发出转换警告。这是因为旧的损坏代码假定int可以表示 ; 的全部值范围void *。编译器无法区分将 a 存储在 a 中的(有效)做法和将 a 存储在anintvoid *的(无效)做法。作为一种解决方案,您可能想要使用而不是,这将避免警告。如果您的原始变量是,只需添加一个额外的中间转换即可避免警告。void *intintptr_tintintintptr_t

于 2012-06-03T15:26:33.950 回答
1

在这种情况下,通过arga参数将 的值压入some_function堆栈是安全的,因为' 的大小足以支持整数的值。void*

于 2012-06-03T15:26:46.313 回答