6

新しい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));
}

だが

  1. 弱い操作は正確に何をしますか?なぜ彼らは時々失敗するのですか、そしてなぜ彼らはより速いのですか?(私はいくつかの筋金入りのマイクロプロセッサアーキテクチャの詳細が大好きです。)

  2. 弱い形式が望ましいのはいつですか、強い形式が推奨されるのはいつですか?

4

0 に答える 0