pthreads:取消阻塞线程

时间:2013-04-25 20:51:04

标签: c pthreads posix

我有像

这样的情况
 -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
}

你知道我可能会尝试什么吗?

提前谢谢

1 个答案:

答案 0 :(得分:3)

pthread_mutex_lock()显然不是取消点,pthread_cancel()可以取消该帖子;如果你真的需要打破线程,你需要找到一种方法来释放它正在等待的互斥锁,以便它可以到达取消点(或者,好吧,不要在需要取消的区域中使用互斥锁)。

来自pthread_cancel()手册;

  

pthread_mutex_lock()不是取消点,尽管它可能无限期阻止;使pthread_mutex_lock()取消点会使写入正确的取消处理程序变得困难,如果不是不可能的话。