std::atomic_flag 可以在信号处理程序中使用吗

bre*_*ing 15 c++ atomic signal-handling language-lawyer c++17

根据C++17 标准 [support.signal],原子对象应满足以下要求才能在信号处理程序中使用:

\n
\n
    \n
  • [...], 或者
  • \n
  • f是在对象上调用的非静态成员函数A,这样A.is_\xc2\xadlock_\xc2\xadfree()会产生true,或
  • \n
  • fA是一个非成员函数,并且对于传递给 的每个指向原子参数的指针fatomic_\xc2\xadis_\xc2\xadlock_\xc2\xadfree(A)都会产生true
  • \n
\n
\n

std::atomic_flag正式地不适合这里(没有is_lock_free方法并且atomic_is_lock_free不能用std::atomic_flag对象调用)。虽然直观上来说,它非常接近(它是原子的且无锁的)。这是否意味着std::atomic_flag不能在信号处理程序中使用,或者它只是一个需要澄清的 C++ 标准?

\n

Jan*_*tke 3

您指出的是标准中的缺陷,已在LWG 3756std::atomic_flag类信号安全吗?

新的措辞显然允许std::atomic_flag在信号处理程序中使用:

普通的无锁原子操作是对[atomics]f中的函数的调用,这样:

  • [...]
  • f是类的非静态成员函数atomic_flag,或者
  • f是一个非成员函数,并且第一个参数的类型fcv atomic_flag*,或者
  • [...]

除非包含以下内容之一,否则评估是信号安全的:

  • 对任何标准库函数的调用,除了普通的无锁原子操作和明确标识为信号安全的函数;
  • [...]

可以安全地假设std::atomic_flag在 C++23 之前的任何标准中也是信号安全的,因为它的目的是并且基本上满足要求,即使在技术上不是这样。