NSThread挑选队列并处理它

时间:2011-04-12 20:10:48

标签: objective-c multithreading ios thread-safety

我有一个应用程序,需要每X毫秒发送一次收集的数据(而不是更快!)。我的第一个想法是在NSMutableArray上的array1thread1)上堆叠数据。当thread2等待它的时间为X毫秒时,它会将NSMutableArray替换为新的(array2),然后处理其内容。但是,我不希望thread1array1拥有thread2时进一步修改thread2

这可能会有效,但是线程安全不是你想要“试试”的领域。这种方法有哪些缺陷,我应该做些什么呢?

(另外,如果{{1}}实际上是一个NSTimer实例,那么问题/答案是如何改变的?这一切都会发生在一个线程上[这对我来说没什么问题,因为处理只需要一小部分时间毫秒])。

2 个答案:

答案 0 :(得分:1)

您应该使用NSOperationQueue或Grand Central Dispatch。基本上,您将创建一个接收数据的操作,并在X毫秒过去后上传它。每个操作都是独立的,您可以配置队列,以及您允许的并发操作数,操作优先级等。

关于并发性的Apple文档应该有所帮助:

http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html

答案 1 :(得分:0)

这种方法的缺陷与你“换出”NSArray换新的方法有关。想象一下,thread1获取对数组的引用,同时thread2交换数组并完成处理。 Thread1现在写入一个死数组(一个不再被处理的数组),即使它只是几毫秒。防止这种情况的方法是在关键部分使用同步代码块(即,使代码“线程安全”),但是有点难以超越标记并同步太多的代码(牺牲表现)。

所以风险就是你:

  • 制作非线程安全的代码
  • 使代码过度使用并且速度很慢(并且线程已经具有性能开销)
  • 将这两者结合起来:缓慢,不安全的代码。

这个想法是“远离线程”,这就是this link的意思。