如何在Objective-C中从另一个线程中读取数组时安全地填充数组?

时间:2009-06-07 19:18:44

标签: iphone objective-c

首先,我对使用线程并不熟悉,而且我正在学习。 我有一个在线程a中使用并在线程b中填充的数组。我想要做的是找到在线程a中使用它之前等待从线程b填充数组的最佳实践。

3 个答案:

答案 0 :(得分:4)

您可以在阅读线程中复制数组,以便在阅读时不会更改,或者您可以@synchronize访问数组:

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

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

答案 1 :(得分:2)

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

在您的情况下,阵列将在填充时被线程B锁定。当线程A试图访问该数组时,它将产生,因为线程B当前持有该锁。当线程B完成时,它将看到线程A在锁定并且唤醒线程A时试图访问该阵列。然后线程A可以安全地访问该阵列。

这是Google搜索Objective C中条件锁后的第一个结果。它是关于iPhone API的,但可能仍然有用:

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

答案 2 :(得分:1)

答案在某种程度上取决于您对数组内容的处理方式。

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

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

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