c++ - C++ 标准甚至定义了 "lock-free"的含义吗?

标签 c++ multithreading c++11 atomic lock-free

我找不到基于锁和无锁原子之间的语义差异。据我所知,就语言而言,差异在语义上没有意义,因为该语言不提供任何时间保证。我能找到的唯一保证是内存排序保证,这两种情况似乎都相同。

(如何)原子的无锁性会影响程序语义?

即,除了调用 is_lock_freeatomic_is_lock_free 之外,是否有可能编写一个定义明确的程序,其行为实际上受到原子是否无锁的影响?< br/> 这些功能甚至具有语义意义吗?或者它们只是用于编写响应式程序的实用 hack,即使该语言从一开始就没有提供时间保证?

最佳答案

至少有一个语义差异。

根据C++11 1.9 程序执行/6:

When the processing of the abstract machine is interrupted by receipt of a signal, the values of objects which are neither of type volatile std::sig_atomic_t nor lock-free atomic objects are unspecified during the execution of the signal handler, and the value of any object not in either of these two categories that is modified by the handler becomes undefined.

换句话说,处理这两类变量是安全的,但应避免对所有其他类别的任何访问或修改。

当然,如果您像那样调用未指定/未定义的行为,您可能会争辩说它不再是一个定义良好的程序,但我不完全确定您的意思是那样还是格式正确(即,可编译)。

但是,即使您不考虑语义差异,性能 差异也值得拥有。如果我必须要有线程间通信的值(value),我可能会按优先顺序选择:

  • 最小的无锁数据类型。
  • 一个比必要的更大的数据类型,如果它是无锁的,而较小的则不是。
  • 一个共享区域完全能够竞争条件,但结合 atomic_flag(保证无锁)来控制访问。

可以根据 ATOMIC_x_LOCK_FREE 宏在编译或运行时选择此行为,这样即使程序的行为无论如何都相同,该行为的最佳方法被选中。

关于c++ - C++ 标准甚至定义了 "lock-free"的含义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31531037/

相关文章:

c - 使匿名枚举成为正确类型的包装器

c++ - 为什么 Effective Modern C++ 的第 25 项中说 "no temporary std::string objects would arise"?

c++ - 在 C++ 中,多继承类中的下划线符号是什么意思?

c++ - reference_wrappers 的容器(需要比较运算符?)

c++ - tolower() 返回一个数字而不是小写形式?

java - 使用多线程将控制台输出到文件

java - 在多线程中使用 RabbitMQ 发布者

C++:未计算上下文中的 lambda 表达式

c++ - 当容器中的基本元素是 boost::tuple 时,为什么我不能使用 std::find?

c# - C#UDP数据包中继器: Restart will not work