pthread在线程函数和取消处理程序中加入子线程



我遇到了以下并发问题的场景,使用 pthread 库实现:

我有一个可能随时被取消的线程。取消该线程时,它需要取消其子线程,并确保其子线程在终止之前已被取消。

所以我最终在子线程上调用pthread_join两次,一次在线程例程中(因为当线程未取消时,我需要该结果(,一次在线程的取消清理处理程序中。

但是,pthread_join不允许两次加入同一线程,那么会发生什么?

下面是伪代码:

void CleanupFunc(void* ChildThread)
{
    pthread_cancel(*(pthread_t*)ChildThread);
    pthread_join(*(pthread_t*)ChildThread, NULL);
}
void* ThreadFunc(void* _)
{
    pthread_t ChildThread;
    pthread_cleanup_push(&CleanupFunc, &ChildThread);
    pthread_create(&ChildThread, NULL, &ChildThreadFunc, NULL);
    pthread_join(ChildThread, NULL);
    pthread_cleanup_pop(0);
}

提前感谢!

但是,pthread_join不允许两次加入同一线程,那么会发生什么?

线程不再可联接,因此结果是未定义的行为。

根据 POSIX 标准文档pthread_join()

如果 thread 指定的值,则行为未定义 参数 to pthread_join() 不引用可连接线程。

最新更新