gpt4 book ai didi

c++ - 在条件和阻塞调用之间收到 C/C++ SIGINT

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:59 24 4
gpt4 key购买 nike

线程 A 在循环中执行阻塞调用,直到线程 B 发出信号让其继续执行其余部分。

我尝试了信号处理程序的经典方法,它会更改条件变量,因此我可以在下一次调用开始之前测试条件。

问题现在出现在这种情况下,当信号在条件检查之后但在阻塞调用之前到达时。

问题的简短伪代码示例:

while(!isInterrupted){
raise(SIGINT)
block()
}

假设我无法访问或更改阻塞代码的实现,并且阻塞调用不提供内部超时功能,信号处理程序可以将其设置为最小值,那么 C 和 C++ 的正确方法是什么处理这个?

信号被用作阻塞调用,只能通过接收 SIGINT 来唤醒。

预先感谢您的帮助。

最佳答案

如果你能像我用 https://github.com/pskocik/musl 那样修改你的 libc 的调用程序集, 那么你可以消除这个 time-of-check to time-of-use problem通过让你的信号处理程序调用一个特殊的函数(在修改后的 libc 中提供),如果在检查后你的代码在函数调用包装器中但不在内核模式中(在内核模式中)时收到信号,该函数将中断系统调用,阻塞调用自然会被信号传递自然打破)。

如果无法访问您的 libc(/您纯粹是在 POSIX 之上构建),我相信您能做的最好的事情就是基于协议(protocol)的解决方案:

  • 设置信号接收者确认信号接收的机制
  • 重复信号发送代码(最好是在 sleep 时),直到收到确认

虽然这可能不是最容易设置的(本质上,您会在一定程度上与 POSIX 作斗争)。如果你负担得起,在新线程中执行阻塞操作应该更简单,并且 pthread_cancelpthread_kill 不同,应该能够可靠地引发响应(在这种情况下, 完成线程取消)在目标中,与 pthread_kill 不同。

使用单独线程的缺点是会占用更多资源。

关于c++ - 在条件和阻塞调用之间收到 C/C++ SIGINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57432023/

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