7

ではなくsizeof(std::atomic<bool>)==1

ミューテックスは単純な を介して実装できるstd::atomic<bool>ため、ミューテックスのサイズはそれと同じくらい小さいか、おそらく4(32ビット)になると思います。

4

3 に答える 3

13

1boolつでは、スピンロックしか実装できませんでした。これは不公平なロックになることに注意してください。これは、待機者が確実にキューに入ることが保証されないためです。最も極端なケースでは、競合が激しくなると、ロックを取得するための競争に常に負けるため、スレッドが永久にブロックされる可能性があります。

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

于 2013-05-22T14:16:10.373 に答える
6

ミューテックスは、単純な方法で実装できますstd::atomic<bool>

mutex::lockこれは必要な操作であり、std::atomic<bool>おそらく非ロックの種類であることを考えると、可能性はないようです。while呼び出しをループすることもできますがcompare_exchange_strong、これは と同じではありませんmutex::lock。これは、待機期間全体で CPU を浪費するためです。

一般に、std::mutexはマルチスレッド動作が定義された単純なものよりもはるかに複雑であり、boolサイズがかなり大きいことを説明しています。これは、コンパイラに依存します。たとえば、ideone ではsizeof(mutex)24です。

于 2013-05-22T14:16:26.660 に答える