问题描述
|
我有一个应用程序需要每X毫秒(而不是更快!)发送收集的数据。我的第一个想法是将数据堆积在
thread1
的NSMutableArray
(array1
)上。当“ 3”完成等待X毫秒后,它将用一个新的(“ 4”)交换NSMutableArray,然后处理其内容。但是,我不希望thread1
一旦拥有thread2
便进一步修改array1
。
这可能会起作用,但是线程安全性不是您想要“只是尝试一下”的领域。这种方法的陷阱是什么,我应该怎么做?
(此外,如果ѭ3实际上是一个NSTimer实例,问题/答案如何变化?是否都在一个线程上发生[对我来说这很好,因为处理只需要一毫秒的时间])。
解决方法
您应该使用NSOperationQueue或Grand Central Dispatch。基本上,您将创建一个接收数据并在X毫秒过去后上传数据的操作。每个操作都是独立的,您可以为队列配置允许的并发操作数,操作优先级等。
Apple关于并发的文档应该可以帮助您:
http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html
,当您“换掉” 9英镑换一个新的时,这种方法的陷阱就产生了。想象一下,线程1获得了对数组的引用,同时线程2交换了数组并完成了处理。 Thread1现在正在写入一个失效的数组(将不再处理该数组),即使只是几毫秒。防止这种情况的方法是在关键部分中使用同步代码块(即,使代码具有“线程安全性”),但是很难避免过度标记和同步您的代码过多(牺牲了性能)。
因此,风险是:
编写不是线程安全的代码
使过度使用的代码同步且速度慢(线程已经具有性能开销)
结合这两种方式:慢速,不安全的代码。
这个想法是“从线程迁移”,这就是链接的含义。