如何在iOS中进行强大的线程本地存储

时间:2013-08-06 13:30:44

标签: ios c cocoa-touch pthreads thread-local-storage

我在设计用于链接到各种iOS应用程序的库中显然从pthread_getspecific获得错误结果时遇到了一些问题。

我看到Apple writes

  

Cocoa和POSIX以不同的方式存储线程字典,因此您无法混合和匹配对这两种技术的调用。但是,只要您在线程代码中坚持使用一种技术,最终结果应该是相似的。在Cocoa中,您使用NSThread对象的threadDictionary方法来检索NSMutableDictionary对象,您可以向该对象添加线程所需的任何键。在POSIX中,您使用pthread_setspecific和pthread_getspecific函数来设置和获取线程的键和值。

这是否意味着当我们不知道调用我们的代码是否已经使用了一个或另一个时,既不 Cocoa也不能使用POSIX TLS函数在库代码中工作?< / p>

如何在这些情况下稳健地存储和检索线程局部指针?

我们应该使用原生的Darwin TLS支持API而不是Cocoa或POSIX吗?

2 个答案:

答案 0 :(得分:6)

我相信Apple的文档正在制作的一点是,您无法使用pthread_setspecific来设置值,然后期望它在threadDictionary中可用。我不希望他们直接相互干涉;他们只是分开。

也就是说,如果这是特定于iOS的代码,那么管理它的the strongly preferred way是使用GCD而不是POSIX线程。 GCD以dispatch_get_specificdispatch_queue_get_specificdispatch_queue_set_specific的形式提供等效的TLS。但它也提供了比POSIX线程更好的线程管理。

答案 1 :(得分:1)

如果你不介意使用C ++,那么boost有thread_specific_ptr。它支持iOS。如果你不想使用C ++,那么实现可能会提供一些关于如何在没有很多外部依赖性的情况下使它工作的提示。