如何在一个线程中安全地填充数组而在另一个Objective-C中读取它?
首先我不熟悉使用线程,我正在学习飞行。 我有一个数组,正在线程a中使用,并在线程b中填充。我想要做的是找到等待从线程b填充数组之前的最佳实践,然后再在线程a中使用它。如何在一个线程中安全地填充数组而在另一个Objective-C中读取它?
我没有使用Objective C,但是你要找的是一个Condition Lock。这是一种锁(互斥体),它可以防止线程访问锁定的数据,但会保持所有请求权限的线程队列(通常使用信号量)。数据解锁后,条件锁定会自动唤醒请求的线程。
在你的情况下,数组将在线程B被锁定时被锁定。当线程A尝试访问数组时,它将会产生,因为线程B当前拥有该锁。当线程B完成后,它会看到线程A在锁定时尝试访问该数组,并唤醒线程A.线程A可以安全地访问该数组。
这里有一个谷歌搜索条件锁在Objective C.这是关于iPhone API后的第一个结果,但可能仍然是有用的:
您可以在阵列复制在读线程所以,当你读它,它不会改变,或者你可以@synchronize
的访问阵列:
- (void) writer
{
@synchronized(theArray)
{
[theArray addObject:foo];
}
}
- (void) reader
{
@synchronized(theArray)
{
for (id item in theArray)
[item …];
}
}
答案一定程度上取决于您使用数组内容做什么。
在某种程度上,这个问题没有多大意义 - 如果线程a必须等到整个数组填充到线程b中,那么为什么不直接在线程a中填充工作呢?在等待阵列时还有什么其他功能呢?
或者,如果线程a在接收数组的每个元素时都可以取得进展,那么将它们创建时从线程b接收到的每个数组条目传递给线程a可能更有意义。在这种情况下,你实际上有一个队列,这是一个用于线程工作的常见生产者/消费者模式 - 线程b填充了一个线程读取队列。
请参阅发布的链接Kai的“使用NSConditionLock对象”部分,以获取示例生产者/消费者锁。
...但在你这样做之前,阅读关于线程锁定的苹果文档。他们概述了一些可以产生的非常微妙的缺陷。 – 2009-06-07 21:24:17