2011-06-23 15 views
4

非同期要求を作成し、別のスレッド上のこの要求のコールバックでmutexのロックを解除するには、前にミューテックスを設定する必要があります。目的C NSLock:異なるスレッドでNSLockをロックおよびロック解除する

アップルのドキュメントは言う:

警告:NSLockクラスは、そのロック 動作を実装するためにPOSIX スレッドを使用しています。ロック解除 メッセージをNSLockオブジェクトに送信する場合は、 というメッセージが、最初のロックを送信した同じスレッド から送信されていることを確認する必要があります。別のスレッド からロックを解除すると、結果は未定義の になる可能性があります。

この「未定義の動作」を回避し、期待どおりに動作させるにはどうすればよいですか?

答えて

6

さらに良いですが、同期プリミティブとしてNSOperationQueueまたはGCDキューを使用します。

ロックは高価であり、セマフォは多かれ少なかれカウンタを備えたロックです。

キューベースのコーディングは、特に組み込みのキューイングメカニズムを使用する場合にはるかに効率的です。

+0

この場合、maxConcurrentOperationCount = 1のNSOperationQueueを使用することをお勧めしますか?この場合、1つの操作しか実行されず、競合状態を持つことはできません – Giuseppe

3

このためにミューテックスを使用しないでください。 1に初期化されたセマフォを使用するか、クロススレッド通信/ロックを可能にする他のロックメカニズムを使用します。

RGDS、 マーティン

3

彼らは無事に今渡すことができ、他のスレッドを通知するために、このためNSConditionを使用してください。

関連する問題