我需要创建一个可序列化的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队列,这是正常的行为吗? 我是否应该担心切换线程,只使用一个对象实例,还是真的序列化?
答案 0 :(得分:0)
这是预期的行为,你不应该担心它。来自Apple的文档(https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html):
串行队列(也称为专用调度队列)按照将它们添加到队列的顺序一次执行一个任务。当前正在执行的任务在由调度队列管理的不同线程(,可能因任务而异)上运行。