2013-05-22 12 views
6

なぜsizeof(std :: mutex)== 40(gcc、clang、icc)ですか? <code>sizeof(std::atomic<bool>)==1</code>ではなく

ミューテックスは単純なstd::atomic<bool>で実装できるので、ミューテックスのサイズはそれほど小さくないかもしれませんが、おそらく4(32ビット)です。

+0

"mutexは単純な' std :: atomic 'で実装できますが、それが最適な実装であるとは限りません。 –

+2

'atomic 'は貧しい人のミューテックスです...つまり、本当に**貧しい人のものです。 – Griwes

+3

私はなぜこの質問が不明であるか役に立たないと思うのだろうかと思います。 –

答えて

11

boolの場合は、スピンロックしか実装できません。なぜなら、ウェイターが待ち行列に入ることを保証するものは何もないので、不公平なロックであることに注意してください。もっとも極端なケースでは、スレッドが常にロックを獲得するレースを失うため、スレッドが永遠にブロックされる可能性があります。

ミューテックスの実装では、待機中のスレッドをスリープ状態にするためにオペレーティングシステムのサポートが必要です。したがって、ミューテックスには、ロックされているかどうかを示すフラグと、待機中のスレッドをスリープさせて起動させるキュー記述子の形式が必要です。ミューテックスが再帰的ロック、堅牢性、オプションの回転、優先順位逆転保護などをサポートできるようにするには、さらに多くのメンバーが必要です。

+0

しかし、Linux上では、1つのアトミック 'int'と' futex'のようなシステムコールで、適切なミューテックスを実装することができます。 –

+0

@MikeSeymour実際にはありません。 –

+0

あなたは「いいえ、できません」、または「実際には、カーネルメモリとユーザスペースの 'int'」を使用しているので意味はありますか?あなたが最初のことを意味するなら、私は同意しなければならないでしょう。 –

11

GNUライブラリは通常、標準スレッドライブラリを実装するためにPosixスレッドを使用します。これは、単一のタイプpthread_mutex_tを使用して、いくつかの異なるタイプのmutexを表します。より複雑なミューテックス(例えば、再帰的ミューテックスのためのカウンタ)に加えて、型を指定するためのフィールドに必要な様々なフィールドを含む。

原則として、オペレーティングシステムからの適切なサポートにより、std::mutexは1バイトのユーザーメモリを使用することができます。 (Linuxでは、それはintでなければならず、他のプラットフォームでは、カーネルリソースに対する整数またはポインタサイズのハンドルかもしれません)。おそらく、十分にテストされた既存の実装を使用する利点は、ミューテックス当たり数十バイトの節約の利点を上回ると考えられます。

6

ミューテックスは、それはmutex::lockが必要な操作であり、std::atomic<bool>が最も可能性の高い非ロック一種であることを考慮すると、可能性のように見えないシンプルなstd::atomic<bool>

を経由して実施することができます。 compare_exchange_strongコールの周りにwhileループを置くことができますが、それは待機期間全体にわたってCPUを浪費するので、mutex::lockと同じではありません。

通常、は、定義されたマルチスレッドの振る舞いを持つ単純なものよりはるかに複雑で、かなり大きなサイズを示しています。これはコンパイラによって異なります。たとえば、on ideone the sizeof(mutex) is 24です。

関連する問題