2009-06-09 12 views
0

ロックがマルチスレッドプログラムのボトルネックになるのはなぜですか?ロックがマルチスレッドプログラムのボトルネックになるのはなぜですか?

私は私のキューが頻繁に、マルチスレッドで私が使用する必要がありますロック

を(POP)とプッシュ()したい場合は?

+1

あなたは「すべてのDevがマルチスレッドアプリについて知っておくべき何同時実行」でこの記事を読んで提案します。繰り返していただけますか? –

+1

これは宿題に関する質問ですか?もしそうなら、そのようなタグを付けてください。 – derobert

答えて

3

使用するロックはプラットフォームによって異なりますが、通常はミューテックスの風味があります。ウィンドウではクリティカルセクションを使用し、.NETではモニターを使用します。私は他のプラットフォームのロック機構にはあまり慣れていません。私はロックフリーのアプローチから離れるだろう。それらは正しくプログラムするのが非常に難しく、パフォーマンスの向上は期待したほど大きくないことがよくあります。

重度の競合が発生すると、ロックはプログラムのボトルネックになります。つまり、非常に多数のスレッドがすべて同時にロックを取得しようとします。これは、スレッドがブロックされ、OSがスレッド間で時間を切り替える時間がますます多くなるため、CPUサイクルが浪費します。この種の問題は、サーバ世界で最も頻繁に現れます。デスクトップアプリケーションでは、ロックによってパフォーマンスの問題が発生することは稀です。キューの

2

「ロックがマルチスレッドプログラムのボトルネックになるのはなぜですか?」 - turnstile(バッフルゲートとも呼ばれます)を考えてみましょう。これは一度に1人の人にしか通じることができず、群衆がそれを通過するのを待っています。

キューの場合は、環境で最も単純なロックを使用してください。

0

ロックは、アルゴリズムの途中でオペレーティングシステムコールを必要とするため、またCPUを作成するときに正しく実行できないため、高価です。プログラマーとして

、それは専門家にあなたのデータ構造の途中でロックを残して、代わりにキューのために、このようなIntel's TBB

として良いmultithreaded libraryを使用するのが最善である、あなたは、ハード(アトミック命令を使用したいと思います)、またはスピンロック(より簡単)を可能にします。これは、mutexと比較して安価であるためです。ロックする必要がある、つまり複雑なツリー構造を変更する作業が多い場合は、mutexを使用してください。

0

私がよく知っているスレッドパッケージでは、mutexのオプションは再帰的で非再帰的です。すべてのアクセスはlock()になります。 queue_op(); unlock()なので、ロックを2回取得する必要はありません。

1

は、それが(離れてグーグル)ロックフリーな実装を書くのは簡単である彼らは、彼らがやっていることをやって停止し、待つためにそれらが発生した他のすべてのスレッドを強制するため

ロックがボトルネックですロックを開くと、時間が無駄になります。マルチスレッドの背後にあるアイデアの1つは、いつでも可能な限り多くのプロセッサを使用することです。ロック時にスレッドを強制的に待機させることにより、アプリケーションは本質的に使用した処理能力を失います。

1

「ロックがマルチスレッドプログラムのボトルネックになるのはなぜですか?」 待機中のスレッドは、共有メモリのロックが解除されるまでブロックされたままです。あなたの質問は少し不明であるhttp://msdn.microsoft.com/en-au/magazine/cc163744.aspx

関連する問題