gpt4 book ai didi

c - 如何退出被信号量挂起的线程?

转载 作者:行者123 更新时间:2023-11-30 14:53:13 27 4
gpt4 key购买 nike

在主函数中,我创建了一个生产者线程和两个消费者线程。生产者做一些工作,然后用“if”语句检查它是否应该中断,然后增加信号量。消费者正在等待信号量变得大于 0 并做一些工作,然后再次等待。当生产者退出时,消费者也应该完成工作并退出。我不明白如何退出由信号量挂起的线程?这是我的代码:

sem_t ready;

void *prod_routine(void*){
while(true){
//do_something
//here i have if statement with break.
sem_post(&ready);
}
pthread_exit(0);
}

void *cons_routine(void*){
while(true){
sem_wait(&ready);
//do something
}
pthread_exit(0);
}

int main(int argc, char *argv[]){

pthread_t prod, cons1, cons2;

sem_init(&ready, 0 , 0);

pthread_create(&prod, NULL, &prod_routine, NULL);
pthread_create(&cons1, NULL, &cons_routine, NULL);
pthread_create(&cons2, NULL, &cons_routine, NULL);

pthread_join(prod, NULL);
pthread_join(cons1, NULL);
pthread_join(cons2, NULL);

return 0;
}

最佳答案

I don't understand how can i exit threads which are suspended by semaphore?

从最字面的意义上来说,你不能。挂起等待获取信号量的线程在停止等待之前无法执行任何操作(包括终止)。那么,主要问题实际上是如何使此类线程停止等待。

至少有四种方法可以实现此目的:

  • 增加信号量,以便线程可以获取它。这是最干净、最好的方法。诀窍是提供一种机制,通过该机制,线程在唤醒时可以识别出它应该终止而不是正常继续。

  • 使用sem_timedwait()而不是sem_wait(),并等待超时到期。这有点狡猾,因为虽然您可以确定 sem_timedwait() 是否由于超时而返回,但不一定清楚线程应该对此执行什么操作。

  • 使用pthread_cancel()向线程发送取消请求。这应该对阻塞在sem_wait()中的线程有效,但它相当严厉。特别是,它启动了一系列事件,或多或少直接导致线程终止。

  • 通过pthread_kill()向线程发送信号。但是要小心,因为信号处理是整个进程范围的。特别是,如果所选信号的处置是“停止”或“终止”(并且未被阻止),那么这将影响整个过程。这依赖于未使用 SA_RESTART 标志配置信号。

除了pthread_cancel()之外,所有这些都有一个共同的要求,即等待信号量的线程需要检查它何时从等待返回为什么 。它必须检查 sem_[timed]wait() 的返回值以及可能的 errno 值,并且可能需要检查一个或多个专用共享变量。

关于c - 如何退出被信号量挂起的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47317048/

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