1

私はObjectiveCの初心者であり、次の問題に遭遇しました。

-(void) funcA
{
   // array is NSMutableArray within class definition and initialised at alloc method
   [array setLength:0];
   ...    
   // make search and delegate itself for callback to funcB
}

-(void)  funcB:(NSData*) data 
{
    [array: appendData:data];
}

(void) funcC
{
      //Finished collecting data
      //Signal caller for funcA that all data is received.
}

funcAは、funcBを呼び出し、最後にすべてのデータが送信されたときにfuncCを呼び出すことによって、データを複数回追加するサーバーに接続するために呼び出されます。これで結構です。

私が抱えている問題は、funcAを複数回呼び出すことができるため、古い要求の処理中に配列が長さ0に設定されることです。

これで、funcAで[NSLockロック]とfuncCで[NSLockロック解除]を試しましたが、2番目の要求でのロック呼び出しによってデッドロックが発生します。同期はこれを回避する別の方法であることを理解していますが、関数内のブロックしか見ていません。

私は通常Cでプログラミングし、pthread_mutexを使用しますが、ずっとobjCに固執したいと思います。それらが異なるスレッドであると仮定しますが、そうではないようです(デッドロックのため)。

どうすればこの問題を解決できますか?

ありがとう。インディ

4

1 に答える 1

4

リエントラントロックを探しているだけだと思います。pthread_mutexデフォルトでは再帰的ではありませんが、オプションとしてです。@synchronized再帰的です。NSLockではありません。

それが必要な場合は、を使用できますNSRecursiveLock

于 2012-04-05T17:39:09.553 に答える