【发布时间】:2016-06-26 03:54:23
【问题描述】:
我正在尝试编写一些库代码,这些代码可供启用(或未启用)pthread 的人以及支持(或不支持)openmp 的人使用。我有一些我真的想在线程本地存储中的变量。例如,指定两次是否有任何潜在危害
#ifdef __GNUC__
# define PREFIX __thread
#elif __STDC_VERSION__ >= 201112L
# define PREFIX _Thread_local
#elif defined(_MSC_VER)
# define PREFIX __declspec(thread)
#else
# define PREFIX
#endif
PREFIX int var = 10;
#pragma omp threadprivate(var)
(注意,找出TLS前缀的业务取自How to declare a variable as thread local portably?)
我知道这适用于我的系统(Debian 与最近的 gcc),但很难知道其他地方是否会出错,因为这些特定于编译器的声明不是 OpenMP 标准的一部分。
【问题讨论】:
-
为什么不先检查 C 标准,然后检查编译器扩展?
-
@Olaf 我只是在匹配我链接的另一个 SO 问题中建议的方式。无论如何,对于我在这里提出的问题而言,我认为这根本不重要。
-
好吧,如果你不知道它是做什么的,就不要遵循一个模式。如果标准提供了一个特性,那么使用扩展通常是不好的设计。始终首先使用最通用的方式。
标签: c multithreading openmp portability