Objective-C可重入函数

时间:2012-04-05 17:34:17

标签: objective-c deadlock reentrancy

我是Objective C中的新手,我遇到了以下问题:

-(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 lock],在funcC中尝试了[NSLock unlock],但是第二次请求的锁定调用会导致死锁。我理解同步是解决这个问题的另一种方法,但我只看到了函数中的块。

我通常使用C编程,我会使用pthread_mutex,但我想坚持使用obj C.假设它们是不同的线程,但似乎它们不是(因为死锁)。

我该如何解决这个问题?

感谢。 印

1 个答案:

答案 0 :(得分:4)

我相信你只是在寻找一个可重入的锁。默认情况下,pthread_mutex不是递归的,而是选项@synchronized是递归的。 NSLock不是。

如果您需要,可以使用NSRecursiveLock