在新C++11
标准中,许多原子操作以“强/弱”对定义:
template< class T >
bool atomic_compare_exchange_weak( std::atomic<T>* obj,
T* expected, T desired );
template< class T >
bool atomic_compare_exchange_weak( volatile std::atomic<T>* obj,
T* expected, T desired );
我知道较弱的可能更快,但偶尔可能会失败,因此需要将其放入while
如下循环(取自 cppreference):
void append(list* s, node* n)
{
node* head;
do {
head = s->head;
n->next = head;
} while(! std::atomic_compare_exchange_weak(s->head, head, n));
}
但
弱操作到底是做什么的?为什么它们有时会失败,为什么它们更快?(我会喜欢一些核心微处理器架构细节。)
什么时候推荐弱形式,什么时候推荐强形式?