GCD线程安全
2017-06-22 本文已影响217人
s2mh
译自官方文档
分发队列与线程安全
在分发队列的环境中谈论线程安全显得有些奇怪,但是线程安全仍然是与其相关的话题。任何时候在你的应用中实现并行功能,都有一些你需要清楚的点:
- 分发队列本身是线程安全的。也就是说,你可以在任意线程中奖任务提交到分发队列中,无需给队列加锁或使用同步机制。
- 别把dispatch_sync函数所在的队列[1]传递给这个函数。这么做会死锁该队列。如果你需要分发到当前的队列,使用dispatch_async函数。
- 避免在提交到分发队列的任务中加锁。尽管在任务中加锁是安全的,一旦你请求加锁,如果锁失效就会阻塞整个串行队列。相似的,对于并行队列,等待一个锁会阻止其他任务的执行。如果你需要同步你对部分代码,使用串行分发队列而不是锁。
- 虽然你可以获得当前任务潜在线程的信息,但最好不要这么做。关于分发队列兼容线程的更多信息,请见Compatibility with POSIX Threads。
-
原文是队列,没有特指串行队列。但是实践表明,这种死锁只会发生在串行队列中。 ↩