我有像
这样的情况 -Thread A-
Lock Mutex
If ActionA() == ERROR
Stop = True
Unlock Mutex
-Mainthread-
Lock Mutex
If ActionB() == ERROR
Stop = True
If Stop == True
Cancel ThreadA
Join ThreadA
Exit program
Unlock Mutex
其中Mutex用于同步。工作线程'线程A'和主线程都可以进入错误状态并设置局部变量'Stop',这将导致线程A的取消和主程序的退出。 Mutex用于在访问Stop(和其他共享对象)时防止竞争条件。
不幸的是,当目标线程在等待Mutex时,调用pthread_cancel()似乎不起作用:
#include <pthread.h>
pthread_mutex_t mutex;
void *thread(void *args){
pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL);
pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
pthread_mutex_lock(&mutex);
return NULL;
}
int main(int argc, const char * argv[])
{
pthread_mutex_init(&mutex, NULL);
pthread_mutex_lock(&mutex);
pthread_t t;
pthread_create(&t, NULL, thread, NULL);
pthread_cancel(t);
pthread_join(t, NULL);
//Execution does not get here
}
你知道我可能会尝试什么吗?
提前谢谢
答案 0 :(得分:3)
pthread_mutex_lock()
显然不是取消点,pthread_cancel()
可以取消该帖子;如果你真的需要打破线程,你需要找到一种方法来释放它正在等待的互斥锁,以便它可以到达取消点(或者,好吧,不要在需要取消的区域中使用互斥锁)。
来自pthread_cancel()手册;
pthread_mutex_lock()不是取消点,尽管它可能无限期阻止;使pthread_mutex_lock()取消点会使写入正确的取消处理程序变得困难,如果不是不可能的话。