Serializable调度队列创建

时间:2015-07-07 11:43:47

标签: ios multithreading serialization

我需要创建一个可序列化的Dispatch队列。

我使用AudioUnit从麦克风注册,然后在创建的队列中对帧进行编码。 我有一个对象编码,所以我总是需要访问它的相同线程。

但是,当我创建队列时:

queue = dispatch_queue_create("com.myapp.queue", DISPATCH_QUEUE_SERIAL);

如果我使用以下命令发送到此队列:

NSLog(@"recording callback Thread Info: %@", [NSThread currentThread]);
dispatch_async(queue, ^{
    [self processAudio];
});

- (void) processAudio
{
    NSLog(@"processAudio Thread Info: %@", [NSThread currentThread]);
...
}

它主要使用相同的线程,直到我得到这个:

recording callback Thread Info: <NSThread: 0x7fb0ab331b90>{number = 12, name = (null)}
processAudio Thread Info: <NSThread: 0x7fb0ab210140>{number = 7, name = (null)}

recording callback Thread Info: <NSThread: 0x7fb0ab331b90>{number = 12, name = (null)}
processAudio Thread Info: <NSThread: 0x7fb0a8e33950>{number = 8, name = (null)}

recording callback Thread Info: <NSThread: 0x7fb0ab331b90>{number = 12, name = (null)}
processAudio Thread Info: <NSThread: 0x7fb0ab212bf0>{number = 13, name = (null)}

dispatch_async将切换线程,然后坚持使用13号线程,直到它再次切换。

虽然我指定我想要一个SERIAL队列,这是正常的行为吗? 我是否应该担心切换线程,只使用一个对象实例,还是真的序列化?

1 个答案:

答案 0 :(得分:0)

这是预期的行为,你不应该担心它。来自Apple的文档(https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html):

  

串行队列(也称为专用调度队列)按照将它们添加到队列的顺序一次执行一个任务。当前正在执行的任务在由调度队列管理的不同线程(,可能因任务而异)上运行。