2

ソースコードを読んboost::shared_ptrでいて、この関数を使用して shared_ptr の使用カウント (参照カウント) を増やしていることがわかりました。

inline void atomic_increment( int * pw )
{
    //atomic_exchange_and_add( pw, 1 );

    __asm__
    (
        "lock\n\t"
        "incl %0":
        "=m"( *pw ): // output (%0)
        "m"( *pw ): // input (%1)
        "cc" // clobbers
    );
}

これを行うために単純に を使用しないのはなぜoperator++ですか? これにより、パフォーマンスが向上しますか?

4

2 に答える 2

9

++演算子は、オペランドの現在の値を読み取り、1を加算して、結果を書き戻します。これは、3つの割り込み可能な(つまり、別のスレッドによる)ステップである可能性があります。2つのスレッドが同時にこれを行う場合、結果が間違っている可能性があります。これから保護するには、不可分操作またはロックを使用する必要があります。これは、上記のasmコードによって実行されます。

于 2012-07-18T01:26:35.687 に答える
3

C ++標準は、i++または++i操作がアトミックであることを保証しません。したがって、コンパイラによっては、アトミックである場合とそうでない場合があります。この回避策では、アセンブリ言語を使用してこの制限を回避します。現在、C ++標準には std::atomic<T>、オブジェクトに対する操作がアトミックであることを保証する機能が含まれています。

于 2012-07-18T01:32:57.203 に答える