8

pthread_getspecific在一个旨在链接到各种 iOS 应用程序的库中显然得到错误的结果时遇到了一些问题。

我看到苹果写道

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

这是否意味着当我们不知道调用我们的代码是否已经在使用其中一个时,不能期望 Cocoa 和 POSIX TLS 函数在库代码中工作

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

我们应该使用原生 Darwin TLS 支持 API 来代替 Cocoa 或 POSIX 吗?

4

2 回答 2

8

我相信 Apple 文档的观点是,您不能使用pthread_setspecific来设置一个值,然后期望它在threadDictionary. 我不希望它们直接相互干扰。他们只是分开的。

也就是说,如果这是特定于 iOS 的代码,那么管理它的首选方法是使用 GCD 而不是 POSIX 线程。GCD 以和的形式提供等效的dispatch_get_specificTLS 。但它也提供了比 POSIX 线程更好的线程管理。dispatch_queue_get_specificdispatch_queue_set_specific

于 2013-08-06T14:12:39.483 回答
1

如果你不介意使用 C++,boost 有thread_specific_ptr. 它支持iOS。如果您不想使用 C++,则该实现可能会提供一些提示,说明如何使其在没有大量外部依赖项的情况下工作。

于 2015-10-19T12:21:14.157 回答