一、pthread_create的子线程不要通过子线程启动函数的参数或者共享内存来获得线程id
创建线程的函数pthread_create不保证线程执行的时机,得根据不同系统的具体实现来确定
#include <pthread.h> int pthread_create( pthread_t *restrict tidp, //新创建的线程ID指向的内存单元。 const pthread_attr_t *restrict attr, //线程属性,默认为NULL void *(*start_rtn)(void *), //新创建的线程从start_rtn函数的地址开始运行 void *restrict arg //默认为NULL。若上述函数需要参数,将参数放入结构中并将地址作为arg传入。 );
新创建线程的id是参数tidp指向的内存单元(FreeBSD中是线程数据结构的地址),通过pthread_create返回。但是在新建线程的函数(start_rtn所指向的函数)中不能从共享内存中读出或者从线程的启动例程中以参数的形式接收。因为在pthread_create返回之前,tidp可能是未经初始化的。如下表所示,在线程开始执行时,tidp未经初始化,所以不能通过tidl来获得线程id。应该使用pthread_self()来在子线程内获得自己的线程id。
{ //伪代码 temp= new pthread_t() 创建线程数据结构 start_rtn() //开始执行子线程 tidp=&temp return *tidp; }
另外还有一个问题,就是子线程的启动函数如果通过参数间接或者直接使用可变变量,则要小心可变变量被主线程或其他线程更改。
参考:https://blog.csdn.net/MonroeD/article/details/60468294