gpt4 book ai didi

c - pthreads:取消阻塞线程

转载 作者:行者123 更新时间:2023-12-04 05:00:18 24 4
gpt4 key购买 nike

我有这样的情况

 -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”和主线程都可以进入错误状态并设置局部变量“停止”,这将导致线程 A 的取消和主程序的退出。 Mutex 用于在访问 Stop(和其他共享对象)时防止竞争条件。

不幸的是,当目标线程正在等待互斥锁时,调用 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
}

你知道我还可以尝试什么吗?

提前谢谢你

最佳答案

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

来自 pthread_cancel()说明书;

pthread_mutex_lock() is not a cancellation point, although it may block indefinitely; making pthread_mutex_lock() a cancellation point would make writing correct cancellation handlers difficult, if not impossible.

关于c - pthreads:取消阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16224469/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com