4

クラス foo があるとします:

class foo {
    static uint32 count_;
    pthread_mutex_t mu;

    void increase() {
      pthread_mutex_lock(&mu);
      count_++;
      pthread_mutex_unlock(&mu);
    }
}

ミューテックスを使用せず、count_ として std::atomic を使用する場合に違いはありますか?

ありがとう!

4

2 に答える 2

6

大きな違いがあります。pthread_mutex_lockシステムコール*が組み込まれている可能性があるため、非常に高価になる可能性があります。アトミックインクリメントは をもたらしlock xaddます。

もう 1 つの利点はstd::atomic<...>、C++ 標準の一部であるため、移植性が高いことです。Windows では、ほとんどの場合、Pthread 呼び出しは機能しません。

*) ロッ​​クが他のスレッドによってすでに保持されている場合に、現在のスレッドをスリープ状態にする。ただし、ほとんどの場合、スピンロックのみが発生します。

于 2013-02-27T01:29:46.437 に答える
4

ミューテックスロックは実際にはそれ自体がアトミックインクリメントとして実装されている可能性が高く、運が悪くてロックで競合が発生した場合は、システムコールも含まれます [もちろん、それがシステムではないと仮定していずれかの方法を呼び出す!].

x86 でのアトミック ソリューションは、単純な「ロック追加」操作になります。他のプロセッサではもっと複雑かもしれませんが、それでもアトミックはミューテックスに必要な最小限のものであるため、とにかく少なくともその量の作業があります。

次に、ミューテックスのロック解除を追加します。これはそれほど複雑ではないかもしれませんが、完全に解放されるわけではありません。

そうです、アトミックに行きましょう。

しかし、パフォーマンスに関係するすべてのことと同様に、「前」と「後」を測定して、実際にパフォーマンスが向上することを確認してください。

元の gnu C++ 標準ライブラリの実装は、実際には操作の周りにある種のミューテックスを使用して行われたと誰かが説明しているのを見たことがあることに注意してください。 )。Microsoft は長い間、適切なアトミック操作をビルトインとしてサポートしてきたので、問題ないはずです。他のプロセッサ アーキテクチャは異なる場合があります。

于 2013-02-27T01:42:05.973 に答える