2015-09-12 8 views
5

条件変数(cv)の使用方法を説明するドキュメントを見ると、たとえば次のように表示されます。 PThreadsとC++では、このcvでnotifyを呼び出すためにcvのmutexを保持する必要はありません。一方、 JavaとPythonでは、同じことをするためにmutexをロックする必要があります。C/C++やその他の言語での条件変数の使用パターン

Javaのような言語の実装で最終的にいくつかのネイティブスレッドツールが使用されることを考えれば、私は後者の場合にこのように実装される深い理由はありますか?

+0

これはおそらくpthreadsの上に実装されていませんが、それは単に前提です。私はこの質問がhttp://cs.stackexchange.com/でより良い(あるいは* *任意の)回答になるかもしれないと感じています... –

+0

明らかにJVMはそのように実装することができますが、私が見たのはよくある間違いです多くの人がC++でやっているのは、合理的に低コストです(ロックを少し長くする必要がありますがそれだけです)。 – Voo

+0

@Voo条件が依存するデータを変更している間にミューテックスが保持されていないという間違いがありますか? – vehsakul

答えて

0

Java notifynotifyAll基本的な同期ツールを使用するには、オブジェクトを呼び出す前に同期をとる必要があります。これは、簡単な安全点のためのもので、wait ingの前に同期させる必要があるためです。

たとえば、2つのスレッドがある場合。 1つのスレッドはバッファからデータを読み取り、1つのスレッドはデータをバッファに書き込みます。

書き込みデータスレッドは、書き込みデータスレッドがバッファにデータブロックの書き込みを完了してブロックを読み取るまで待機する必要があります。

notify()wait()もし、及びnotifyAll()方法は、あなたがどこ競合状態を取得することができ、同期せずに呼び出すことができます。

  • 読み取りスレッドがwait()を呼び出し、スレッドが待ちキューに追加されます。

  • 同時に、書き込みスレッドはnotify()を呼び出してデータが追加されたことを通知します。

  • wait()が処理される前にnotify()が処理されて以来、読み取りスレッドは変更を失い、永遠に待ちます。この競合状態が除去された同期ブロック内で発生するwaitnotifyを強制することにより

関連する問題