【问题标题】:NSThread Picks Up Queue and Processes ItNSThread 获取队列并处理它
【发布时间】:2011-04-12 20:10:47
【问题描述】:

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

这可能会奏效,但线程安全不是您想“尝试一下”的领域。这种方法有什么缺陷,我应该怎么做?

(另外,如果thread2 实际上是一个 NSTimer 实例,那么问题/答案会如何变化?这一切都会发生在一个线程上吗[这对我来说很好,因为处理只需要一毫秒的时间] ?)。

【问题讨论】:

    标签: objective-c multithreading ios thread-safety


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      所以风险是你会:

      • 编写非线程安全的代码
      • 使过度使用同步的代码变慢(并且线程已经有性能开销)
      • 将这两者结合起来:速度慢、不安全的代码。

      这个想法是“从线程迁移”,这就是this link 的意义所在。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        相关资源
        最近更新 更多