我现在正在学习线程。 我想知道是否有可能传递一个variables到我的线程。 我的分配是创build一个线程,并为每个线程分配一个数字(如果您愿意的话),每100ms打印一次数字。 我目前的程序如下:
#define PCHECK(sts,msg) if((sts)!=0){printf("error : %s\n",msg); exit(EXIT_FAILURE)} #define NB_THREAD 5 void* do_nothing(void* data) { int i; //printf("creation thread %d",(int)data); while(1) { usleep(100000); printf("thread number : %d \n",data); } i = 0; pthread_exit(NULL); //exit(EXIT_SUCCESS); } int main(int argc, char *argv[]) { int pid, j, status; pthread_t thread; int * res; int stat; for (j = 0; j < NB_THREAD; j++) { stat = pthread_create(&thread, NULL, do_nothing, (void *) j ); if (stat !=0) { perror ("pthread_create()"); } } for (j = 0; j < NB_THREAD; j++) { pthread_join(thread, (void **) &res ); } return EXIT_SUCCESS; }
目前唯一打印的数字是0(数据的值)。 有人可以指出我去哪里错了谢谢:)
以下是如何将参数传递给pthreads的一些很好的例子
[1] https://computing.llnl.gov/tutorials/pthreads/#PassingArguments
我怀疑你的问题可能是你在一个使用32位int
类型的64位系统上运行它。 所以data
是一个64位的void*
类型,但是在你的线程函数中,你将它打印为一个32位的int
:
// example assumes that this thread instance was started by // pthread_create(&thread, NULL, do_nothing, (void *) j ) when // j == 1 printf("thread number : %d \n",data); ^ ^ | +-------- passing a 64-bit pointer 0x00000000.00000001 | +---------------- treats the pointer argument as a 32-bit int and happens to only see the all-zero 32-bits
我怀疑,如果将printf()
更改为:
printf("thread number : %d \n", (int) data);
一般来说,在编写线程函数时,我认为让线程函数的第一个动作是将传递给线程函数的数据项转换为实际传递给pthread_create()
的类型是个好主意:
void* do_nothing(void* data) { int id = (int) data; // `pthread_create()` was passed an `int` // `data` is not used again after this point // ... }
其他几点
如果你传递一个指向数据的实际指针给线程函数,确保每个线程都得到自己独立的副本(除非数据应该是每个线程的同一个实例,这是可能的但不常见的)。
如果你正在旋转多个线程,你需要保持每个pthread_t
pthread_create()
返回的pthread_t
对象pthread_create()
也许是在一个数组中),以便稍后加入它们,或者在重用之前调用pthread_join()
/ pthread_detach()
pthread_t
对象,以便系统在线程完成运行时可以清理为该线程分配的所有资源。 在发布的例子中,可能无关紧要,因为线程将永远运行(或直到杀死进程)。 您拥有的pthread_join()
调用永远不会成功完成。
但是当你改变东西时,下面的代码注定要中断,所以线程函数会在一段时间后停止:
for (j = 0; j < NB_THREAD; j++) { pthread_join(thread, (void **) &res ); }
因为thread
只创建了最后一个线程的pthread_t
,所以一旦成功加入,它就无法再使用了。 下一个循环迭代将尝试加入已经加入并且不再有效的线程。