我在 Windows 上安装 mingw-w64,有两个选项:win32 线程和 posix 线程。我知道win32线程和pthreads有什么区别,但我不明白这两个选项有什么区别。我怀疑如果我选择 posix 线程,它会阻止我调用像 CreateThread 这样的 WinAPI 函数。
似乎这个选项指定了某个程序或库将使用哪个线程 API,但是用什么?通过 GCC、libstdc++ 还是其他方式?
我发现了这个: Windows的gcc端口中thread_posixs和thread_win32有什么区别?
简而言之,对于这个版本的mingw,threads-posix版本会使用posix API并允许使用std::thread,threads- win32会使用win32 API,并禁用std::thread部分标准。
好的,如果我将选择 win32 线程,则 std::thread 将不可用,但仍将使用 win32 线程。但是被什么用?
GCC 带有一个编译器运行时库 (libgcc),它用于(除其他外)为它支持的语言中的多线程相关功能提供低级操作系统抽象。最相关的示例是 libstdc 的 C11 <thread>、<mutex>和<future>,当 GCC 使用其内部 Win32 线程模型构建时,它们没有完整的实现。MinGW-w64 提供了一个 winpthreads(在 Win32 多线程 API 之上的一个 pthreads 实现),然后 GCC 可以链接到它以启用所有花哨的功能。
<thread>
<mutex>
<future>
我必须强调这个选项不会禁止您编写任何您想要的代码(它绝对不会 影响 您可以在代码中调用的 API)。它仅反映 GCC 的运行时库 (libgcc/libstdc++/…) 用于其功能的内容。@James 引用的警告与 GCC 的内部线程模型无关,而是与 Microsoft 的 CRT 实现有关。
总结一下:
posix
win32
两者都不会影响任何调用 Win32 API 或 pthreads API 的用户代码。您始终可以同时使用两者。