我遇到了以下并发问题的场景,使用 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
指定的值,则行为未定义 参数 topthread_join()
不引用可连接线程。