Linux Pthread库,线程参数
如果我在Linux下使用Pthread
库创建线程,我需要使用函数pthread_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; }
我想做这样的事情,所以我可以保持变量的值在堆栈上,这样我就可以从我的线程例程中访问它,但我不想为单个变量创建struct或手动分配内存。
我将创建这样的几个线程,所以我想知道在这样的情况下我是否可以通过并且不使用列表或动态数组。
你在做什么在现实世界中是完全安全的: int
和void *
之间的转换不是未定义的行为,它是实现定义的,并且所有实现都以自然,理智的方式定义它。 它也是将单整数参数传递给新线程的唯一有效方法。 其他方法都需要昂贵的同步,通过显式锁定或在原始线程中使用malloc
并在新线程中free
(在malloc
/ free
实现中隐藏了隐式同步成本)。
但是,您将发现的一件事是,某些编译器会发出转换警告。 这是因为旧的代码假定int
可以表示void *
的全部值; 编译器无法区分在void *
中存储int
的(有效)实践,以及在int
中存储void *
的(无效)实践。 作为解决方案,您可能希望使用intptr_t
而不是int
,这将避免警告。 如果原始变量是int
,只需通过intptr_t
添加额外的中间intptr_t
就可以避免出现警告。
在这种情况下,通过arg参数将a
的值推送到some_function
的堆栈是安全的,因为void*
的大小足以支持整数的值。