C++11中有两个原子CAS操作:atomic_compare_exchange_weak
和atomic_compare_exchange_strong
。
根据cppreference:
弱形式的函数允许错误地失败,也就是说,即使它们相等,也会表现为 * obj!=* expected。当比较和交换在循环中时,弱形式的函数在某些平台上会产生更好的性能。当弱比较和交换需要循环而强比较和交换不需要循环时,强比较和交换更可取。
下面是一个使用 * weak * 版本的例子,我认为:
do {
expected = current.value();
desired = f(expected);
} while (!current.atomic_compare_exchange_weak(expected, desired));
有人能举一个例子,说明比较和交换不在循环中,所以 * strong * 版本更可取吗?
1条答案
按热度按时间cuxqih211#
atomic_compare_exchange_XXX
函数用观察到的值更新它们的“expected”参数,因此您的循环如下所示:如果期望值与期望值 * 无关 *,则该循环变为:
让我们添加一些语义。让我们假设有几个线程同时运行它。在每种情况下,
desired
都是当前线程的非零ID,而current
用于提供互斥以确保某个线程执行清理任务。我们并不真正关心是哪个线程。但我们希望确保某个线程获得访问权(并且其他线程可能通过从current
阅读优胜者的ID来观察赢家)。我们可以通过以下方式实现所需的语义:
在这种情况下,
atomic_compare_exchange_weak
需要一个循环来实现与atomic_compare_exchange_strong
相同的效果,因为可能出现伪故障:该标准建议,在这种情况下,实现可以为
atomic_compare_exchange_strong
提供比使用..._weak
循环更高效的代码(atomics.types.operations/25)。