Tag: thread local storage

带有icc的OpenMP和线程本地存储标识符

这是一个简单的测试代码: #include __thread int a = 0; int main() { #pragma omp parallel default(none) { a = 1; } return 0; } gcc编译这个没有任何问题-fopenmp ,但icc (ICC) 12.0.2 20110112与-openmp抱怨 test.c(7):错误:必须在包含OpenMP并行编译指示的变量列表中指定“a”#pragma omp parallel default(none) 我不知道哪种范式(即shared , private , threadprivate )适用于这种类型的变量。 哪一个是正确使用的? 我在调用访问该线程局部变量的函数时得到了预期的行为,但是我在显式并行部分中访问它时遇到了麻烦。 编辑: 到目前为止,我最好的解决方案是通过函数返回指向变量的指针 static inline int * get_a() { return &a; }

C中的_Thread_local存储类说明符?

我在一本名为_Thread_local新标准C存储类中阅读了“ 如何编程7 ”一书中的注释: 新的C标准添加了存储类说明符_Thread_local ,这超出了本书的范围。 我在谷歌和这里寻找它,但没有出现。 有人可以给我一些关于它的链接吗?

如何将变量声明为本地可移植的线程?

C11引入了_Thread_local存储类说明符,可以与static和extern存储类说明符结合使用,将变量声明为线程局部。 GNU C编译器套件使用相同的语义实现存储类说明__thread 。 不幸的是我没有找到任何实际实现_Thread_local关键字的编译器(我尝试过gcc,clang和SUN studio)。 我目前使用以下构造来声明关键字thread_local : /* gcc doesn’t know _Thread_local from C11 yet */ #ifdef __GNUC__ # define thread_local __thread #elif __STDC_VERSION__ >= 201112L # define thread_local _Thread_local #else # error Don’t know how to define thread_local #endif 我知道这可能不适用于MSVC和其他编译器。 任何人都可以建议我一个更好的方法来声明thread_local ,使其在尽可能多的编译器中工作吗? 编辑 Christoph建议Microsoft Visual C允许__declspec(thread) 。 这是更新的宏定义: /* gcc doesn’t know _Thread_local […]

线程特定数据与线程本地存储

我读过Kerrisk的Linux编程接口:Linux和UNIX系统编程手册 ,第31章关于线程。 本章包括线程特定数据(第31.3.4节)和线程本地存储(第31.4节)。 第663-669页介绍了这些主题。 线程特定数据( pthread_key_create , pthread_setspecific , pthread_getspecific和friends)看起来更强大,但使用起来似乎更麻烦,并且似乎更频繁地使用内存管理器。 线程本地存储(静态和全局声明上的__thread )看起来不那么强大,因为它仅限于编译时间,但它看起来更容易使用,并且似乎在运行时不在内存管理器中。 我可能对运行时内存管理器有误,因为在遇到__thread变量时,可能会有幕后调用pthread_key_create代码。 Kerrisk没有提供这两种策略的比较/对比,他也没有就何时使用哪种策略提出建议。 为问题添加上下文:我正在评估第三方库。 该库使用全局变量,不使用锁定,我想在multithreading程序中使用它。 该程序使用线程来最小化网络延迟。 有没有赢家? 或者有不同的场景可以保证使用其中一种吗?

gcc`__thread`如何工作?

如何在gcc中实现__thread ? 它只是pthread_getspecific和pthread_setspecific的包装器吗? 使用我的程序使用posix API进行TLS,现在看到我的程序运行时的30%用在pthread_getspecific上,我感到很失望。 我在每个需要资源的函数调用的条目上调用它。 pthread_getspecific联优化之后,编译器似乎没有优化pthread_getspecific 。 因此,在内联函数之后,代码基本上一次又一次地搜索正确的TLS指针以获得返回的相同指针。 __thread会在这种情况下帮助我吗? 我知道C11中有thread_local ,但我所拥有的gcc还不支持它。 (但现在我看到我的gcc确实支持_Thread_local而不是宏。) 我知道我可以简单地测试并看到。 但是我现在必须去别的地方了,在我尝试重大改写之前,我想更好地了解一个function。