在新的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));
}
但是
弱操作究竟做了什么?为什么他们有时会失败,为什么他们会更快? (我会喜欢一些核心微处理器架构细节。)
什么时候弱的形式更好,什么时候推荐强的?