我不确定以下代码是否会导致未定义的行为.
//global
pthread_t thread1;
void *worker(void *arg){
//do stuff
}
void spawnThread(){
//init stuff
int iret1 = pthread_create( &thread1, NULL, worker, (void*) p);
}
Run Code Online (Sandbox Code Playgroud)
我的spawnThread将使用全局thread1创建一个新线程.
如果我当前正在运行未完成的线程,在使用thread1变量启动新线程时,是否会以某种方式导致未定义的行为?
如果这是一个问题,将pthread_t变量设置为函数本地是否有意义?我认为这可能是问题,因为它将使用堆栈,并且一旦我从我的函数返回将被删除.
如果我将pthread_t本地化为函数,我就不能在程序的另一部分中使用pthread_join.规范的解决方案是,使用互斥计数器来跟踪当前运行的线程数量吗?
谢谢
Ant*_*ams 15
这pthread_t只是一个标识符.您可以将其复制或随意销毁.当然,正如你所提到的,如果你销毁它(因为它是本地的),那么你就不能用它来打电话pthread_join.
如果pthread_t为多个线程重用相同的变量,那么除非一次只激活一个线程,否则用新的线程覆盖旧值,并且只能调用pthread_join最近启动的线程.此外,如果从多个线程内部启动线程,则需要pthread_t使用互斥锁保护变量.
如果您需要等待线程完成,请为其提供自己的pthread_t变量,并pthread_join在需要等待的位置调用.如果您不需要等待线程完成,请pthread_detach()在创建后调用,或使用创建属性启动分离的线程.