在线程和另一个轮询线程之间共享队列

时间:2012-09-23 15:58:22

标签: ios multithreading grand-central-dispatch

我正在编写一个iOS应用程序,其中多个iDevices可以相互连接并相互发送消息。当iDevice1向iDevice2发送消息时,我希望将该消息插入iDevice2中的队列中。 iDevice2上的一个单独的后台线程现在通过此队列并使消息出列。我的问题有两个,如下:

  1. 实现无限循环的后台线程(直到应用程序终止)并从队列中轮询和出列项目的最佳方法是什么?
  2. 在循环后台线程和将消息插入队列的线程之间共享队列的最佳方法是什么?
  3. 我一直在使用dispatch_async grand central dispatch方法在不同的线程中执行任务,并且它一直运行良好。我应该使用dispatch_async方法来启动轮询队列的后台线程吗?这种方法是否会处理切换到其他线程,或者后台线程是否会占用处理器,因为它正在进行无限循环?感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

这里更重要/有趣的问题是为什么你有一个后台线程(轮询或其他)进入GCD队列而不是简单地使整个事情成为基于GCD的工作流,其中一个队列上运行的块(可能与一个队列相关联)调度源或信号量)将工作提交到工作队列中。换句话说,管理iDevice1和iDevice2的代码都应该使用GCD编写,并表达工作流的意图与进行任何手动线程管理。代码将更容易理解,更易于维护!

答案 1 :(得分:0)

你不想轮询,这是不好的做法,它没有充分的理由使用CPU。你想要做的是使用NSMutableArray设置一个共享的fifo,并用NSConditionLock保护它的访问。消费者任务(您可以使用NSOperation创建)将锁定NSConditionLock,直到生产者任务发出信号表明fifo中有一些数据可用。

答案 2 :(得分:0)

无需轮询队列 - 队列中的项目将根据队列的语义执行。你可以这样做:

-(dispatch_queue_t)messageQueue {
    static dispatch_queue_t queue;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        queue = dispatch_queue_create("my message queue", DISPATCH_QUEUE_SERIAL);
    });
    return queue;
}

-(void)didRecieveMessage:(NSString *)message {
    dispatch_async([self messageQueue], ^{
        // do something with message
        dispatch_async(dispatch_get_main_queue(), ^{
            // update the UI
        });

    });
}