c - openmp threadprivate 和 gcc __thread 兼容性
问题描述
我对“openMP 线程”的理解是它们可能不会一对一地映射到 OS 线程。openMP规范似乎不需要这个。
GCC 有关键字__thread
,它用于线程本地存储(根据我的解释,线程与 OS 线程中的线程一样)。这是否意味着 GCC__thread
与 openMP 不兼容threadprivate
?如果openMP规范允许将openMP线程多路复用到OS线程上,那么我认为__thread
并且threadprivate
不兼容。
我看到不久前有人问过旧版本的 GCC,它说它们基本上是兼容的。对于较新版本的 GCC(比如 GCC 11.2)仍然如此吗?
解决方案
大多数实现都是如此。我所知道的所有 OpenMP 实现都是基于操作系统级别的线程(Linux 上的 pthreads,Windows 上的 Winthreads),因此C 或C++ 中的__thread
关键字应该没有问题。thread_local
但正如你所说的那样,这是事情如何实施的问题。OpenMP API 没有对事情必须如何在内部工作做出任何声明,因此从技术上讲,可以完成不基于操作系统级线程的实现,然后可能会破坏基础语言功能,OpenMP API 对此没有指定 thre 交互。