2012-10-22 8 views
5

私がブーストの旧バージョンで知っている限り、Windows用の実装はクリティカルセクションを使って行われました。boost::mutexしかしBoost 1.51の最新バージョンでは、ミューテックスの実装がイベントに基づいていることがわかりました。Windows用のブーストミューテックスの実装

この変更の背景にある合理的なものは誰か分かりますか?パフォーマンス上の理由により完了しましたか?クリティカルセクションは廃止予定ですか?

+0

あなたはboostsのchangelogsを見た? – PlasmaHH

+1

私が見る限り、さまざまなミューテックスの設計を簡素化し統一するために行われました:現在、 'mutex'、' timed_mutex'、 'try_mutex' - はすべて' detail :: basic_timed_mutex'を使って実装されています。 CS。 (実際には、CSを使用することが常に最良の選択であるとはいえないが、それは並行処理のシナリオに依存するので、設計を複雑にする価値はない) –

+1

ブーストの設計者だけがこれに完全に答えることができることを理解する。私たちの残りの部分だけが推測することができます... – Tudor

答えて

5

boostを使用すると、私たちはいつも最高のアプローチを変更していないのですか? boostの新バージョンでは、boost::mutexがスピンロックとして実装されていますが、ビジー待機を回避するWindowsイベントの助けを借りて、そのイベントは必要に応じて作成されるため、非常に軽量で非常に高いパフォーマンスを持ち、boostこの軽量を使用するにはmutexタイムドウェイト!私はこれが素晴らしいと思う。

+0

これは正しいことはできません、本当のスピンロックはカーネルモードでのみ可能です... – Benj

+0

@Benjそしてここで本当のスピンロックが必要だと誰が言いましたか? 'boost ::'の多くの部分は、 'boost :: shared_ptr'と' boost :: detail :: spinlock'の実装を見て、そのスピンロックの性能を比較する小さなプログラムを書くなど、原子変数を使って実装されたスピンロックに依存していますWindowsやさらに* nixシステムに実装されている最速のロックを実装すると、その結果が素晴らしいことがわかります! – BigBoss

+2

あなたはほぼ正しいですが、実際には 'boost :: mutex'はスピンロックをまったく使用しません!これは、最適化として原子操作を使用します。ロックを取得するとき、最初に(ミューテックスが現在ロックされているかどうかを示す変数をチェックします)。ロックされていない場合は、(win32イベントを考慮する必要なしに)続行することができます。これは高速パスです。検査でmutexがロックされていると言われたら、(もっと)高価なwin32のものが発生します。しかし、ここでは全くスピンロックはありません;-) – Frunsi

関連する問題