GCD是否确保在同一队列中工作的所有块始终在同一个线程中工作?(关于ABAddressBookRef)

时间:2011-08-09 06:45:08

标签: thread-safety addressbook grand-central-dispatch objective-c-blocks

GCD是否确保在同一队列中工作的所有块始终在同一个线程中工作?

如果我为此队列创建一个调度队列和dispath_async块,那么调度到该队列的所有块是否都在同一个线程中工作?

由于我正在开发一个使用ABAdrressbook Framerowk的项目,并且该文档说不能在线程之间使用ABAddressBookRef和ABRecordRef,所以我想知道队列中的所有块是否都在同一个线程中,我可以创建该队列只有一个AddressBookRef。

3 个答案:

答案 0 :(得分:6)

绑定到特定线程的唯一队列是主队列,它绑定到主(UI)线程。

如果唯一的要求是不同时访问对象,那么使用串行队列应该可以正常工作。

如果对象依赖于线程本地状态,则必须强制所有操作到特定线程。最简单的方法是将你的串行队列定位到主线程,但只有当你知道你不会长时间陷入困境时才会有效。否则,您将挂起您的UI。在这种情况下,您将必须创建自己的处理程序线程并在那里发送工作。

答案 1 :(得分:4)

  

队列不受任何特定约束   执行线程

无法保证发送到串行队列的所有块都被发送到同一个线程。我找不到任何ABAddressBookCreate与GCD串行队列组合的源代码......

答案 2 :(得分:0)

当文档说某些东西不能在线程之间使用时,它只意味着API不能同时从不同的线程同时使用。 API本身不会记住关于调用它的线程或类似的东西的任何特殊内容,并且每次强制它都是相同的。

在GCD之前,您将使用@synchronize序列化对共享资源的访问。正如您自己建议的那样,为此创建队列是另一种序列化对此资源的访问的方式,这种方式更有效。