【发布时间】:2017-09-04 13:31:43
【问题描述】:
我遇到了以下并发问题的场景,使用 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(ChildThread, NULL); -
取消一个线程从来都不是一个好主意。您可能想过度考虑程序的设计。
标签: multithreading unix pthreads pthread-join