我找不到基于锁和无锁原子之间的语义差异。据我所知,就语言而言,差异在语义上没有意义,因为该语言不提供任何时间保证。我能找到的唯一保证是内存排序保证,这两种情况似乎都相同。
(如何)原子的无锁性会影响程序语义?
即,除了调用 is_lock_free
或 atomic_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/