适当地存储线程特定变量

时间:2013-05-30 05:39:14

标签: c multithreading pthreads hashtable binary-search

我正在重组现有的应用程序代码。这种重组的要求之一是我需要存储一个特定于线程的变量,这个变量经常用于读取和写入。我会有大约50个这样的线程。线程特定变量基本上是指向结构的指针。 在这里,我无法确定应该如何存储此变量。我是否应该使其成为特定于线程的密钥,pthread_getspecific/pthread_setspecific可以访问该密钥?但是我发现了一些帖子,说这些电话的调用非常慢。然后另一种方法可以是具有全局结构,该结构将所有这些线程特定指针存储在排序数组(以使用二进制搜索)或键值形式的元素的哈希表中。键主要是常量(thread_id),值可以经常更改。那么这里最好的方法是什么? 我知道对所需值的最快访问是将指针实际传递给每个函数并继续传播它。但这需要大量的代码重写,我想避免。 在此先感谢您的回复。

4 个答案:

答案 0 :(得分:1)

如果你的线程是静态的(也就是你启动它们,除非程序退出,它们就不会退出),那么你可以简单地使用你关心的任何映射结构。唯一的技巧是在允许所有线程运行之前需要填充映射。因此,您可能需要一个互斥锁和条件变量来阻止所有线程,直到填充地图为止。之后,您可以向所有等待的线程广播。由于地图在此之后永远不会改变,因此每个线程都可以从中读取而没有任何争用来检索其特定于线程的信息。

如果您正在使用GCC,那么您可以使用特定于编译器的扩展。 __thread存储类扩展将一个全局变量放在一个特定于线程的区域中,这样每个线程都有自己的全局副本。

__thread struct info_type *info;

答案 1 :(得分:1)

如果您正在使用gcc工具链(其他一些编译器),您还有第三个选项。使用__thread存储类说明符。这非常有效。它的工作原理是将线程本地存储项隔离到单独的VM页面中,这些VM页面在调度线程时会被切换。这样每个线程都能够指向自己的变量副本。成本只是每个线程计划的一个操作,没有其他方法的每个键查找成本。

答案 2 :(得分:1)

在进行任何操作之前,请勿过早优化,测量标准方法的性能。它们不应该平均使用超过100个时钟周期来为您提供特定于线程的指针。在许多应用中,这与噪声无法区分。

然后,我怀疑任何可以通过某种全局变量或函数获得的可移植解决方案都可以比POSIX函数更快。基本上他们没有比你提出的更多的东西,但可能更好地优化。

最好的选择是在每个线程的堆栈上实现数据,并将指向该数据的指针传递给需要它的函数。

如果你有一个符合C11标准的编译器(我认为clang已经实现了那个部分),你可以使用_Thread构造,它为你提供你想要的变量类型。其他编译器(前C11)具有带扩展的这些功能,例如gcc编译器系列有__thread

答案 3 :(得分:0)

我不明白。结构是否特定于线程?你的指针指向的那个? 如果是,那么具有线程特定结构的问题是什么?如果要共享,(50个线程同时!)你可以有一个全局变量,虽然同步可能会导致哪些更新值的问题。 为什么要指向所有线程特定数据的指针?