我找不到基于锁和无锁原子之间的语义差异。据我所知,就语言而言,差异在语义上没有意义,因为语言不提供任何时间保证。我能找到的唯一保证是内存排序保证,这两种情况似乎是相同的。
(如何)原子的无锁性会影响程序语义?
即,除了调用 is_lock_freeatomic_is_lock_free 之外,是否有可能编写一个定义明确的程序,其行为实际上受到原子是否无锁的影响?
这些函数甚至具有语义意义吗?或者它们只是编写响应式程序的实用技巧,即使该语言从一开始就从未提供时间保证?

最佳答案

在 C++11 标准中,术语“无锁”没有很好地定义,如 issue LWG #2075 中所述。

C++14 标准定义了 C++ 语言中的无锁执行(N3927 批准)。

引用 C++14 1.10[intro.multithread]/第 4 段:



上述“无锁”的定义取决于未阻塞线程的行为。 C++ Standard 没有直接定义非阻塞线程,而是 17.3.3[defns.blocked] 定义了阻塞线程:





我认为答案是否定的,除了作为 paxdiablo's answer 的信号处理程序,当“程序语义”意味着原子操作的副作用时。
atomic 的无锁性会影响整个多线程程序的进度保证强度。
当两个(或更多)线程同时对同一个对象执行无锁原子操作时,这些操作中的至少一个应该在最坏的线程调度下完成。
换句话说,“邪恶的”线程调度程序理论上可以故意阻止基于锁的原子操作的进程。

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

10-14 12:25
查看更多