【问题标题】:Redundant __thread and omp threadlocal declaration冗余 __thread 和 omp threadlocal 声明
【发布时间】: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


【解决方案1】:

怎么样:

#if __STDC_VERSION__ >= 201112L
# define PREFIX _Thread_local
#elif defined(__GNUC__)
# define PREFIX __thread
#elif defined(_MSC_VER)
# define PREFIX __declspec(thread)
#else
# define PREFIX
#endif

PREFIX int var = 10;
#if !PREFIX
#ifdef _OPENMP
#pragma omp threadprivate(var)
#else
#error "Failure to put variable into TLS"
#endif
#endif

GCC 不介意过度指定,因为无论如何__thread 是一个隐含的#pragma omp threadprivate

不必担心编译器可能不是这种情况,只需有条件地使用 OpenMP 的 threadprivate

【讨论】:

  • 上次我检查了musl 没有与gomp 一起工作。因此,如果 OP 使用 glibc 以外的标准库,OpenMP 可能不可用。
  • 谢谢,但我更多的是询问双重指定是否有任何问题,而不是通过更多预处理器指令来避免它。
  • @DanRoche 恐怕没有明确的答案。在任何地方都没有指定在这种情况下应该发生什么。最好是避免它。
猜你喜欢
  • 2012-10-24
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2011-07-01
  • 2023-01-16
  • 1970-01-01
相关资源
最近更新 更多