首先我不熟悉使用线程,我正在学习飞行。 我有一个数组,正在线程a中使用,并在线程b中填充。我想要做的是找到等待从线程b填充数组之前的最佳实践,然后再在线程a中使用它。如何在一个线程中安全地填充数组而在另一个Objective-C中读取它?
2
A
回答
2
我没有使用Objective C,但是你要找的是一个Condition Lock。这是一种锁(互斥体),它可以防止线程访问锁定的数据,但会保持所有请求权限的线程队列(通常使用信号量)。数据解锁后,条件锁定会自动唤醒请求的线程。
在你的情况下,数组将在线程B被锁定时被锁定。当线程A尝试访问数组时,它将会产生,因为线程B当前拥有该锁。当线程B完成后,它会看到线程A在锁定时尝试访问该数组,并唤醒线程A.线程A可以安全地访问该数组。
这里有一个谷歌搜索条件锁在Objective C.这是关于iPhone API后的第一个结果,但可能仍然是有用的:
4
您可以在阵列复制在读线程所以,当你读它,它不会改变,或者你可以@synchronize
的访问阵列:
- (void) writer
{
@synchronized(theArray)
{
[theArray addObject:foo];
}
}
- (void) reader
{
@synchronized(theArray)
{
for (id item in theArray)
[item …];
}
}
1
答案一定程度上取决于您使用数组内容做什么。
在某种程度上,这个问题没有多大意义 - 如果线程a必须等到整个数组填充到线程b中,那么为什么不直接在线程a中填充工作呢?在等待阵列时还有什么其他功能呢?
或者,如果线程a在接收数组的每个元素时都可以取得进展,那么将它们创建时从线程b接收到的每个数组条目传递给线程a可能更有意义。在这种情况下,你实际上有一个队列,这是一个用于线程工作的常见生产者/消费者模式 - 线程b填充了一个线程读取队列。
请参阅发布的链接Kai的“使用NSConditionLock对象”部分,以获取示例生产者/消费者锁。
相关问题
- 1. 在另一个线程中填充ObservableCollection
- 2. 如何安全地从一个线程读取变量并从另一个线程修改它?
- 3. 从另一个表中创建一个表而不填充它
- 4. 一个线程读取和另一个写入volatile变量 - 线程安全?
- 5. 正在读取int []数组,而另一个线程更新int []数组安全吗?
- 6. 如何在一个对象中填充一个arrayList的一半,并在java中填充另一个对象?
- 7. 如何在另一个线程组中执行线程组?
- 8. 如何用另一个对象在一个类中填充NSMutableArray?
- 9. PHP - 如何在另一个类中填充一个变量
- 10. jQuery的 - 如何在另一个页面中填充一个div
- 11. 如何创建一个数据库并在安装过程中填充它
- 12. 在一个线程中调用Add on SortedDictionary并在另一个线程中获取Item是否安全?
- 13. 一个线程如何在另一个线程中被杀死
- 14. PHP $ _SESSION数组填充在一个div中并在另一个空格
- 15. 多线程写入,一个线程从队列中读取,线程安全
- 16. 如何安全地从流中读取一个unsigned int?
- 17. 如何在另一个线程中运行一个函数
- 18. 如何在c#中填充线程安全ListView?
- 19. 如何让一个线程改变数组属性,而另一个线程在数组副本上迭代
- 20. 分配一个数组并填充它
- 21. 线程安全:JFrame和另一个类
- 22. 如何用另一个数组填充数组?
- 23. 在Pandas中,为什么一个数组填充0而另一个是非数组?
- 24. 如何在线程中安全地处理一个对象,而另一个线程可以在Delphi中使用该对象?
- 25. 如何安全地检查另一个线程的主线程标志?
- 26. 在一个类中填充一个数组
- 27. 如何用另一个数组创建或填充一个numpy数组?
- 28. 从另一个数组中使用乘法填充数组
- 29. 用Java中另一个数组的元素填充数组
- 30. 从数组中填充另一个数组 - Javascript
...但在你这样做之前,阅读关于线程锁定的苹果文档。他们概述了一些可以产生的非常微妙的缺陷。 – 2009-06-07 21:24:17