通过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指针

  1. 整数可以转换为任何指针类型。 除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。

所以你最好将一个单独的指针传递给每个线程。

这是一个完整的工作示例,它为每个线程传递一个指向数组中单独元素的指针:

 #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*)(&params)); 

那么你可以cast paramsPARAMS*并在pthread routine使用它:

 PARAMS *p = static_cast(params); p->i = 5; strcpy(p->c, "hello"); p->f = 45.2;