You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jthread::request_stop是否具备信号安全性?求信号安全函数判定法则

信号处理程序中函数调用的判定与jthread::request_stop的安全性

关于jthread::request_stop的信号安全性

首先明确:jthread::request_stop不能直接在信号处理程序中调用。

C标准并没有将jthread::request_stop标记为异步信号安全的函数。它本质是操作std::stop_source的内部状态,虽然底层可能用到原子操作,但C标准仅明确了少数C兼容函数、无锁原子操作属于信号安全范畴,所有jthread相关的成员函数都不在此列。直接在信号处理程序里调用它,会触发未定义行为。

判定函数信号安全性的经验法则

  • 查官方标准清单:优先参考对应平台的信号安全函数列表(比如POSIX的signal-safety(7)手册),C标准里只有和C兼容的信号安全函数、以及无锁原子操作被认可为安全,其余C标准库函数默认都不安全。
  • 排查函数内部行为:只要函数涉及以下操作,绝对不能在信号处理程序中调用:
    • 动态内存分配/释放(比如new、delete、malloc)
    • 持有或获取互斥锁(包括标准库容器、流操作隐式的锁)
    • 调用其他非信号安全的函数
    • 修改非原子的全局、静态变量
  • 原子操作的局限性:只有标准规定的无锁原子操作(比如std::atomic的store/load基础操作)是安全的,但复杂的原子逻辑组合依然可能因为信号打断导致状态异常。
  • 安全替代思路:如果要在SIGINT触发时终止jthread,更稳妥的方式是用一个std::atomic<bool>作为终止标记,信号处理程序里仅原子设置这个标记;工作线程则定期检查该标记,主动调用request_stop或退出执行。

内容的提问来源于stack exchange,提问作者Morse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:27:10