2011-12-23 4 views
2

私はこのローミングサービスでNSConditionクラスを使用しています:NSConditionはどのように機能しますか?

- (void) method1 
{ 
    [[cocoaCondition lock] lock]; 
    while (!someCheckIsTrue) { 
     [cocoaCondition wait]; 
    } 
    // Do something. 
    [cocoaCondition unlock]; 
} 

- (void) method2 
{ 
    [cocoaCondition lock]; 
    // Do something. 
    someCheckIsTrue = YES; 
    [cocoaCondition signal]; 
    [cocoaCondition unlock]; 
} 

私は法1を実行し、方法2を実行しているスレッド2スレッド1、二つのスレッドを持っています。 [cocoaCondition wait]が呼び出されると、thread1がブロックされることを願っています。スレッド2が[cocoaCondition signal]を呼び出すと、スレッド1は実行を再開します。私はコードをテストして、それは私が望むように動作します。

しかし、あなたが見るように、時にコードの実行:

ステップ1、スレッド1呼び出し:[cocoaCondition lock](アップルドキュメントは言う:ロックを取得しようとすると、ロックが取得できるようになるまでスレッドの実行をブロックする)

ステップ2、スレッド1が呼び出されます:[cocoaCondition wait]
ステップ3、スレッド2呼び出し:[cocoaCondition lock](Appleのドキュメントに続いて、スレッド2はブロックされるべき)
ステップ4、スレッド2呼び出し:[cocoaCondition signal](だから、スレッド2はブロックとすることができますする必要があります」このメソッドをまで呼び出す3210が呼び出されます)

私のコードはデッドロックされていると思いますが、どうしてですか? 私は、thread1がステップ2で[cocoaCondition wait]を呼び出すと、cocoaConditionがロックされていると思いますか?

+1

なぜwhileループが必要ですか?あなたはちょうど待機を呼び出すことはできませんし、信号が待って終了すると呼ばれる? – jjxtra

+0

@jjxtra AppleのNSConditionの文書: "ブール述語は、シグナル伝達の仕組みのために条件を使用する意味の重要な部分であり、条件のシグナリングが条件そのものを保証するものではありません。偽の信号が表示される可能性があります。 – Gobe

答えて

4

NSCondition Class Reference

ドキュメントは言う:「、条件オブジェクトがそのロックとブロックのスレッドのロックを解除するとき、スレッドが待機状態に状態が通知された場合、システムは、スレッドをウェイクアップ状態オブジェクトは、。。 waitまたはwaitUntilDate:メソッドから戻る前にロックを再獲得します。つまり、スレッドの観点から見ると、常にロックを保持しているかのようです。

あなたの推測は正しいです。

関連する問題