首先,我对使用线程并不熟悉,而且我正在学习。 我有一个在线程a中使用并在线程b中填充的数组。我想要做的是找到在线程a中使用它之前等待从线程b填充数组的最佳实践。
答案 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的,但可能仍然有用:
答案 2 :(得分:1)
答案在某种程度上取决于您对数组内容的处理方式。
在某种程度上,这个问题没有多大意义 - 如果线程a必须等到整个数组在线程b中填充,那么为什么不在线程a中进行填充工作呢?在等待阵列时还有什么其他的事情?
或者,如果线程a在接收到数组的每个元素时可以前进,那么在创建时将每个接收到的数组条目从线程b传递给线程a可能更有意义。在这种情况下,你实际上有一个队列,这是线程工作的常见生产者/消费者模式 - 线程b填充一个线程读取的队列。
请参阅Kai发布的链接的“使用NSConditionLock对象”部分,以获取示例生产者/消费者锁定。