に関するこの Apple のドキュメントからNSCondition
、の使用法は次のようにNSCondition
なります。
スレッド 1:
[cocoaCondition lock];
while (timeToDoWork <= 0)
[cocoaCondition wait];
timeToDoWork--;
// Do real work here.
[cocoaCondition unlock];
スレッド 2:
[cocoaCondition lock];
timeToDoWork++;
[cocoaCondition signal];
[cocoaCondition unlock];
そして、メソッドのドキュメントsignal
でNSConditon
:
このメソッドを使用して、条件で待機している 1 つのスレッドをウェイクアップします。このメソッドを複数回呼び出して、複数のスレッドを起動することができます。条件で待機しているスレッドがない場合、このメソッドは何もしません。競合状態を回避するには、レシーバーがロックされているときにのみこのメソッドを呼び出す必要があります。
私の質問は:
どのような状況でもThread 2がブロックされたくないので、 Thread 2を削除しlock
てunlock
呼び出します。つまり、スレッド 2は好きなだけ作業を行うことができ、スレッド 1はその作業を 1 つずつ実行し、それ以上作業がなければ待機 (ブロック) します。これも生産者と消費者のパターンですが、生産者がブロックされることはありません。
しかし、Apple のドキュメントによると、この方法は正しくありません。では、このパターンで何がうまくいかないのでしょうか? ありがとう。