2010-12-08 3 views
2

私はiPhone用の同時実行アプリケーションを作成しています。 私はこのコードかしら:サイクル中に空に相当するミューテックスをブロックしていますか?

while(!conditionBoolean) 
{ 
    // do nothing 
    // until another thread makes this variable true. 
} 

makeWork(); 

は以下と等価です:それはない場合

[lock lock];  // this lock is locked by another thread 
        // causing the current to block until it's unlocked 

[lock unlock]; 
makeWork(); 

、違いは何ですか?

ありがとうございます。

答えて

6

最初のものは、タイトなループと遅延を生成します。あるいは、希望する方法で変数が設定されないようにすることさえできます。少なくとも、そのループにはある種の睡眠を遅らせる必要があります。

作業完了のためのシグナリングプリミティブを待つ方が良いでしょう。それは、他のスレッドによってシグナリングされます。設計は、他のスレッドがロックする可能性のあるmutexや状態変数に依存します。あなたのチャンスを得る前に変更してください。一般的に、マルチスレッド設計ではイベント駆動型(プッシュモデル)で、共有状態を機敏にチェックするのではなく(モデルをプルする)、より良い方法です。

+0

ありがとう、スティーブ!シグナリングプリミティブの例を挙げられますか?例えば、 – wh1t3cat1k

+0

。 'NSConditionLock' - ここをクリックhttp://objc.toodarkpark.net/Foundation/Classes/NSConditionLock.html –

1

mutexを理解することは、ロックがより少ないサイクルで発生する可能性があることです。たとえば、conditionbooleanを読んでいる間は、別のスレッドが読んでいる間に別のスレッドがtrueに変更する可能性がありますもう一度読む前に偽になります。これは、競合状態に変わります。これは、mutexのロックが回避することを望みます。同様のwhileループを持つ多数の関数がある場合、これによってコードが "次の行"にならない可能性があります。

+0

通常、Mutexは利用可能になるまでサイクルを使用しません。レースに関するあなたのコメントは正しいですし、「ベスト推測」スレッドのやりとりを使用しない別の理由もあります。 –

関連する問題