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
相关产品推荐
相关产品推荐

