我遇到了以下带有并发问题的场景,使用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);
}
提前致谢!
答案 0 :(得分:0)
但是,pthread_join不允许两次加入同一个线程,那么会发生什么?
线程不再可连接,因此结果是未定义的行为。
根据POSIX standard documentation for pthread_join()
:
如果
thread
指定的值,则行为未定义pthread_join()
的参数不引用可连接的线程。