首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pthreads:取消阻塞线程

pthreads:取消阻塞线程
EN

Stack Overflow用户
提问于 2013-04-26 04:51:04
回答 1查看 3.5K关注 0票数 2

我有这样的情况

代码语言:javascript
复制
 -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

其中互斥锁用于同步。工作线程'Thread A‘和主线程都可以进入错误状态,然后设置本地变量'Stop’,这应该会导致取消线程A并退出主程序。Mutex用于防止在访问Stop (和其他共享对象)时出现争用情况。

不幸的是,当目标线程等待互斥时,调用pthread_cancel()似乎不起作用:

代码语言:javascript
复制
#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
}

你知道我还会尝试别的什么吗?

提前谢谢你

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-26 05:05:35

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

摘自pthread_cancel()手册;

pthread_mutex_lock()不是一个取消点,尽管它可能会无限期地阻塞;使pthread_mutex_lock()成为一个取消点将使编写正确的取消处理程序变得困难,如果不是不可能的话。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16224469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档