新しい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));
}
だが
弱い操作は正確に何をしますか?なぜ彼らは時々失敗するのですか、そしてなぜ彼らはより速いのですか?(私はいくつかの筋金入りのマイクロプロセッサアーキテクチャの詳細が大好きです。)
弱い形式が望ましいのはいつですか、強い形式が推奨されるのはいつですか?