通过pthread_create传递整数值
我只是想将一个整数的值传递给一个线程。
我怎样才能做到这一点?
我试过了:
int i; pthread_t thread_tid[10]; for(i=0; i<10; i++) { pthread_create(&thread_tid[i], NULL, collector, i); }
线程方法如下所示:
void *collector( void *arg) { int a = (int) arg; ...
我收到以下警告:
warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
如果你没有将i
转换为void指针,编译器会抱怨:
pthread_create(&thread_tid[i], NULL, collector, (void*)i);
也就是说,将一个整数转换为指针并不严格安全:
ISO / IEC 9899:201x 6.3.2.3指针
- 整数可以转换为任何指针类型。 除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。
所以你最好将一个单独的指针传递给每个线程。
这是一个完整的工作示例,它为每个线程传递一个指向数组中单独元素的指针:
#include #include void * collector(void* arg) { int* a = (int*)arg; printf("%d\n", *a); return NULL; } int main() { int i, id[10]; pthread_t thread_tid[10]; for(i = 0; i < 10; i++) { id[i] = i; pthread_create(&thread_tid[i], NULL, collector, (void*)(id + i)); } for(i = 0; i < 10; i++) { pthread_join(thread_tid[i], NULL); } return 0; }
这里有一个很好的介绍pthreads。
void *foo(void *i) { int a = *((int *) i); free(i); } int main { int *arg = (char*)malloc(sizeof(char)) pthread_create(&thread, 0, foo, arg); }
int是32位,64位Linux中的void *是64位; 在这种情况下,您应该使用long int而不是int;
long int i; pthread_create(&thread_id, NULL, fun, (void*)i);
int fun(void * i)函数
long int id = (long int) i;
最好使用struct
来在一个中发送更多参数:
struct PARAMS { int i; char c[255]; float f; } params; pthread_create(&thread_id, NULL, fun, (void*)(¶ms));
那么你可以cast
params
为PARAMS*
并在pthread
routine
使用它:
PARAMS *p = static_cast(params); p->i = 5; strcpy(p->c, "hello"); p->f = 45.2;