为当前运行的线程重用pthread_t变量

我不确定以下代码是否会导致未定义的行为。

//global pthread_t thread1; void *worker(void *arg){ //do stuff } void spawnThread(){ //init stuff int iret1 = pthread_create( &thread1, NULL, worker, (void*) p); } 

我的spawnThread将使用全局thread1创建一个新线程。

如果我当前正在运行未完成的线程,在使用thread1变量启动新线程时,是否会以某种方式导致未定义的行为?

如果这是一个问题,将pthread_t变量设置为函数本地是否有意义? 我认为这可能是问题,因为它将使用堆栈,并且一旦我从我的函数返回将被删除。

如果我将pthread_t本地化为函数,我就不能在程序的另一部分使用pthread_join。 规范的解决方案是,使用互斥计数器来跟踪当前运行的线程数量吗?

谢谢

pthread_t只是一个标识符。 您可以将其复制或随意销毁。 当然,正如你所提到的,如果你销毁它(因为它是本地的),那么你就不能用它来调用pthread_join

如果为多个线程重用相同的pthread_t变量,那么除非一次只激活一个线程,否则使用新的线程覆盖旧值,并且只能在最近启动的线程上调用pthread_join 。 此外,如果从多个线程内部启动线程,则需要使用互斥锁保护pthread_t变量。

如果需要等待线程完成,请为其提供自己的pthread_t变量,并在需要等待的位置调用pthread_join 。 如果您不需要等待线程完成,请在创建后调用pthread_detach() ,或使用创建属性启动分离的线程。

问题是,你的thread1变量是引用你的第一个线程的唯一方法。

我经常使用的解决方案是有一个pthread_t数组,用于存储我需要引用的线程ID。 在此示例中,它是一个静态数组,但您也可以使用动态分配的内存。

 static pthread_t running_threads[MAX_THREAD_RUNNING_LIMIT]; static unsigned int running_thread_count = 0; // each time you create a new thread: pthread_create( &running_threads[running_thread_count], blabla...); running_thread_count++; // don't forget to check running_thread_count against the size // of your running thread size MAX_THREAD_RUNNING_LIMIT 

当你需要加入()时,只需在循环中执行:

 for(i =0; i 

pthread_t只是一个标识符,你可以用它做任何你喜欢的事情。 线程状态在C库内部维护(在Glibc / NPTL的情况下,在线程本地存储上的内部struct thread上,通过GS寄存器在x86上访问)。