Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iOS中实现健壮的线程本地存储_Ios_C_Cocoa Touch_Pthreads_Thread Local Storage - Fatal编程技术网

如何在iOS中实现健壮的线程本地存储

如何在iOS中实现健壮的线程本地存储,ios,c,cocoa-touch,pthreads,thread-local-storage,Ios,C,Cocoa Touch,Pthreads,Thread Local Storage,我在一个旨在链接到各种iOS应用程序的库中遇到了一些问题,显然从pthread\u getspecific中得到了错误的结果 我看到: Cocoa和POSIX以不同的方式存储线程字典,因此不能混合和匹配对这两种技术的调用。但是,只要在线程代码中坚持使用一种技术,最终结果应该是相似的。在Cocoa中,使用NSThread对象的threadDictionary方法检索NSMutableDictionary对象,您可以向其中添加线程所需的任何键。在POSIX中,可以使用pthread_setspeci

我在一个旨在链接到各种iOS应用程序的库中遇到了一些问题,显然从
pthread\u getspecific
中得到了错误的结果

我看到:

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

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

在这种情况下,如何可靠地存储和检索线程本地指针


我们是否应该使用本机的Darwin TLS支持API来代替Cocoa或POSIX?

我相信苹果的文档提出的观点是,您不能使用
pthread\u setspecific
来设置值,然后期望它在
threadDictionary
中可用。我不希望他们直接互相干涉;他们只是分开了


也就是说,如果这是特定于iOS的代码,那么要管理它就需要使用GCD而不是POSIX线程。GCD提供了TLS的等价物,其形式为
dispatch\u get\u specific
dispatch\u queue\u get\u specific
dispatch\u queue\u set\u specific
。但是它也提供了比POSIX线程更好的线程管理。

< P>如果你不介意使用C++,Boost已经拥有。它支持iOS。如果你不想使用C++,这个实现可能会提供一些提示,告诉你如何在没有外部依赖的情况下工作。

干扰会是我们看到的崩溃的一个很好的解释,但是…它是一个针对现有代码的特定于iOS的粘合层,这些代码希望看到它所运行的所有平台的通用抽象。进入一个想要篡夺角色或我们现有良好运行的并发概念的供应商锁定不是一个选项(毕竟没有干扰,只是程序中其他地方的并发混乱导致一些指针悬空).已解决:最初让我怀疑pthread_getspecific出现故障的症状原来是由于程序中其他地方的不相关竞争条件留下的悬空指针引起的。