gpt4 book ai didi

c - 通过信号中断两个阻塞线程

转载 作者:太空狗 更新时间:2023-10-29 15:02:49 25 4
gpt4 key购买 nike

在我的应用程序中,主线程创建了两个连接的线程;一种通过在循环中调用 scanf() 来等待用户输入,另一种通过在循环中调用 accept() 来监听传入的套接字连接。新连接在分离的单独线程中处理。

我希望程序在收到 SIGINT 信号时自行关闭。这意味着监听线程应该停止接受新连接,等待当前服务连接的线程关闭,然后再关闭。等待用户输入的线程也应该结束,从而允许主线程结束。

Scanf() 和 accept() 都阻塞但可以被信号中断,但是发送到进程的信号只能由一个线程处理(AFAIK)。我的想法是在除等待它的主线程之外的所有线程中阻止 SIGINT 信号。当它接收到 SIGINT 时,它会将 SIGUSR1 发送到两个线程(一个在 scanf() 上阻塞,一个在 accept() 上阻塞),然后加入这些线程。

这是一个好的解决方案吗?是否有更好或可能是标准的方法来实现这一点?

最佳答案

此类问题的规范解决方案是 Thread Cancellation .当线程阻塞在作为取消点的函数中时到达的取消请求将被立即处理;否则,它会在下次线程调用作为取消点的函数时执行。

使用取消的唯一痛苦之处在于,它建立在异常处理模型而非失败返回模型之上。您需要在大部分时间保持取消阻止(并且仅在您要处理取消的操作期间启用它)或者在您所在的每个调用框架级别安装取消清理处理程序(基本上是 C 中的半丑陋异常处理程序)可能有中间状态/分配/等。当你的线程被取消时清除。我个人更喜欢第一种方法,它通常只需要安装一个取消处理程序。

任何基于中断信号的方法本质上都存在竞争条件。如果信号是在调用阻塞函数之前发送的,那么当信号处理程序返回时,阻塞函数将被调用并无限期地阻塞(因为“是时候退出了吗?”的检查已经成功通过)。

关于c - 通过信号中断两个阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9056274/

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