2012-03-01 12 views
3

- 私は私がunlockWithConditionを(NSConditionLockを使用)を使用して回避しようとしたNSLockを使って、このエラーを取得し、関係なく、私は同じ結果を得る:IOS SDK - NSLockメッセージ:「スレッドからロック解除もロックしていなかった」

* _NSLockError()をブレークしてデバッグします。 * - [NSLock unlock]:ロックしていないスレッドからロック( '(null)')を解除しました。

- 私it'sが悪い場合はわからないが、何 - 私にすることはこれです:

new Thread: 
[lockA lock];//waiting unlock 
[lockB lock];//waiting unlock 
..shared code.. 
[lockA unlock]; 
[lockB unlock]; 

in Main Thread: 
//Do two HTTP request. 

//when request respond, I unlock the locks in respective threads with [lockA unlock]; 
[lockB unlock]; 

だから、セクション "..sharedコード.." を実行することができます。なぜこのエラーが出るのか分かりません。

誰かが私が間違っていることを説明できますか?完璧に動作するはずです。

+0

があるがLOCKA/B上の別のスレッドから呼び出しますか? –

+2

'_NSLockError()'にブレークポイントを置くと、違法ロック解除がどこで発生しているのかを示すスタックトレースが得られます。あなたはそれを試しましたか? – user1118321

+0

はい、私は新しいスレッドでリクエストの応答を解析します。 – ZiggyST

答えて

6

ここでは、セマフォーとしてロックを使用しようとしていると思います。ロックは、バックグラウンドスレッドとメインスレッドが何かに同時にアクセスするのを止めるためのものです。したがって、ロックを保持しているスレッドはロックを解除(ロック解除)する必要があります。

バックグラウンドスレッドがメインスレッドで何か起こるのを待つ場合は、セマフォを使用します。いいと簡単にセマフォ

使用GCDセマフォ:https://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

+1

はい、ありがたいことに、iosがセマフォを持っていることを知りませんでした。 – ZiggyST

+0

この回答がシナリオのセマフォーの使用法を実際に拡張していれば素晴らしいだろう... –

1

NSURLConnectionなどでHTTPリクエストを行い、デリゲートでロックを解除しようとしている場合は、明示的にscheduleInRunLoop:modeを使用しない限り、NSURLConnectionをどこから作成して開始するかを注意する必要があります別のスレッドまたはループを実行します。

メインスレッドでロックしていることが確実であれば、そのスレッドでロックを解除する必要があります。 ...空間であなたのロックを解除して

dispatch_async(dispatch_get_main_queue(), ^(void) { 
     ... 
    }); 

:そこに戻って取得するには、使用して、メインスレッド上でコールバックするperformSelectorOnMainThread:withObject:waitUntilDone:コールバックやGCDのどちらかを使用することができます。移動する前にロック解除が完了したことを知る必要がある場合は、代わりにdispatch_sync()を使用できます。

しかし、あなたがすでに試してみたように、NSConditionLockを使用することは解決策です。しかし、メインスレッドではなく、検索スレッドでロックを行う必要があります。条件は特定の条件を使用して-unlockWithCondition:によって保護されるため、検索スレッドが準備完了とマークする前にロック解除されません。

したがって、メインスレッドで検索スレッドを起動します。各検索スレッドで-lockを入力し、次にデータを取得するために進み、次に-unlockWithContidition:に進みます。消費者スレッドでは、-lockWhenConditionを使用してください。

しかし、キーは、同じスレッドでロックしてロックを解除する必要があります。

+0

お返事ありがとうございます、私は同じスレッドでアンロックしていません、なぜこれが問題なのですか?それはロックの通常の機能です。何かを待って準備をしてください。 – ZiggyST

+0

OK、既にNSConditionロックを試していたのを見て、私はそのエラーを実行せずにそうする方法について上記のコメントを追加しました。 – gaige

+0

答えをありがとう、しかし私はそれをロック解除するスレッドからロックすることはできません。私は何をしますか:私は別のHHTP要求から来る2つの異なる値を必要とするので、リクエストを行い、関数の魔法使いは両方の値を必要とします(別のスレッドperformSelectorInBackground :)を使用して、パースが終了すると、NSlockのロックを解除するので、他のスレッドはそれらの値を使用するように手続きできます。 PD:NSconditionLockを使用して、私は同じエラーメッセージを持っています。 – ZiggyST

関連する問題