如何使用预处理器检测 GCC 线程模型?

Posted

技术标签:

【中文标题】如何使用预处理器检测 GCC 线程模型?【英文标题】:How to detect GCC threading model with preprocessor? 【发布时间】:2014-12-16 04:15:29 【问题描述】:

我正在编写一些库代码,它们可以选择使用某个 C++11 功能(thread_local 对象)。但是,我的 found a bug 仅在 MinGW-w64 的 g++ 构建中使用 POSIX 线程模型(Win32 可以正常工作)。

那么,如何使用预处理器检测当前编译器是否为具有 POSIX 线程模型的 g++

g++ -v 产生 ... Thread model: win32... Thread model: posix 取决于差异,但我需要一种方法来有条件地编译代码(以解决该错误),而不涉及调用 g++ 的额外实例。

【问题讨论】:

【参考方案1】:

检查是否定义了宏__WINPTHREADS_VERSION。如果是这样,您正在 MinGW 上使用 posix 线程。

例如:

#if defined(_WIN32) && !defined(__WINPTHREADS_VERSION)
    Logic for MinGW win32 threads;
#else
    Logic for MinGW posix threads or Linux/UNIX;
#endif

示例/参考:

http://savannah.gnu.org/support/?108150#comment0

https://projects.kde.org/projects/kdesupport/emerge/repository/revisions/master/entry/portage/win32libs/libssh/0002-add-a-way-to-test-ssh-connections-on-windows.patch#L114

【讨论】:

完美运行,谢谢!请注意,您需要包含 <thread> 才能对其进行定义(即使 std::thread 在 Win32 线程模型中不起作用,标头仍然存在,因此允许检测便携式线程模型)。

以上是关于如何使用预处理器检测 GCC 线程模型?的主要内容,如果未能解决你的问题,请参考以下文章

redis 的线程模型

线程局部存储: gcc __thread与c++11 thread_local 关键字

Redis 的线程模型了解么?

Redis 的线程模型了解么?

Redis 的线程模型了解么?

redis补充5之Redis 的线程模型