2009-06-07 22 views

回答

2

我没有使用Objective C,但是你要找的是一个Condition Lock。这是一种锁(互斥体),它可以防止线程访问锁定的数据,但会保持所有请求权限的线程队列(通常使用信号量)。数据解锁后,条件锁定会自动唤醒请求的线程。

在你的情况下,数组将在线程B被锁定时被锁定。当线程A尝试访问数组时,它将会产生,因为线程B当前拥有该锁。当线程B完成后,它会看到线程A在锁定时尝试访问该数组,并唤醒线程A.线程A可以安全地访问该数组。

这里有一个谷歌搜索条件锁在Objective C.这是关于iPhone API后的第一个结果,但可能仍然是有用的:

http://developer.apple.com/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW4

4

您可以在阵列复制在读线程所以,当你读它,它不会改变,或者你可以@synchronize的访问阵列:

- (void) writer 
{ 
    @synchronized(theArray) 
    { 
     [theArray addObject:foo]; 
    } 
} 

- (void) reader 
{ 
    @synchronized(theArray) 
    { 
     for (id item in theArray) 
      [item …]; 
    } 
} 
+0

...但在你这样做之前,阅读关于线程锁定的苹果文档。他们概述了一些可以产生的非常微妙的缺陷。 – 2009-06-07 21:24:17

1

答案一定程度上取决于您使用数组内容做什么。

在某种程度上,这个问题没有多大意义 - 如果线程a必须等到整个数组填充到线程b中,那么为什么不直接在线程a中填充工作呢?在等待阵列时还有什么其他功能呢?

或者,如果线程a在接收数组的每个元素时都可以取得进展,那么将它们创建时从线程b接收到的每个数组条目传递给线程a可能更有意义。在这种情况下,你实际上有一个队列,这是一个用于线程工作的常见生产者/消费者模式 - 线程b填充了一个线程读取队列。

请参阅发布的链接Kai的“使用NSConditionLock对象”部分,以获取示例生产者/消费者锁。

相关问题