Mingw-w64线程: posx vs win32

我正在 Windows 上安装 mingw-w64,有两个选项: win32线程和 posx 线程。我知道 win32线程和 pthread 之间的区别,但是我不明白这两个选项之间的区别。我怀疑如果我选择 posx 线程,它会阻止我调用像 CreateThread 这样的 WinAPI 函数。

这个选项似乎指定了某个程序或库将使用哪个线程 API,但是由什么使用呢?是通过 GCC、 libstdc + + 还是通过其他方式?

我发现了这个: 在 windows 的 gcc 端口中 thread _ posxs 和 thread _ win32有什么区别?

简而言之,对于这个版本的 mingw,thread-posx 版本将使用 posx API 并允许使用 std: : thread,而 thread-win32将使用 win32 API,并禁用标准中的 std: : thread 部分。

好的,如果我选择 win32线程,那么 std: : 线程将不可用,但 win32线程将仍然使用。但是被什么利用呢?

156483 次浏览

部分 GCC 运行时(特别是异常处理)依赖于所使用的线程模型。因此,如果您正在使用由 POSIX 线程构建的运行时版本,但是决定在自己的代码中使用 Win32 API 创建线程,那么在某个时候您可能会遇到问题。

即使您使用的是运行时的 Win32线程版本,您也不应该直接调用 Win32 API。引自 MinGW 常见问题:

由于 MinGW 使用 Windows 附带的标准 Microsoft C 运行时库,因此您应该小心并使用正确的函数来生成新线程。特别是,CreateThread函数不能正确地为 C 运行时库设置堆栈。您应该改用 _beginthreadex,它(几乎)与 CreateThread完全兼容。

GCC 附带了一个编译器运行时库(libgcc) ,它使用这个库(除了其他事情之外)为它支持的语言中的多线程相关功能提供一个低级 OS 抽象。最相关的例子是 libstdc + + 的 C + + 11 <thread><mutex><future>,当使用其内部 Win32线程模型构建 GCC 时,它们没有完整的实现。MinGW-w64提供了一个 winpthread (Win32多线程 API 之上的一个 pthread 实现) ,GCC 可以通过它链接来启用所有奇特的特性。

我必须强调这个选项并不禁止您编写任何您想要的代码(它绝对会影响您可以在代码中调用的 API)。它只反映了 GCC 的运行时库(libgcc/libstdc + +/...)使用的功能。@ James 引用的警告与 GCC 的内部线程模型无关,而是与微软的 CRT 实现有关。

总结一下:

  • posix: 启用 C + + 11/C11多线程特性。使得 libgcc 依赖于 libwinpthread,因此即使不直接调用 pthread API,也将分发 winpthread DLL。在应用程序中再分发一个 DLL 并没有什么错。
  • win32: 没有 C + + 11多线程特性。

对调用 Win32API 或 pthread API 的任何用户代码都没有影响。

注意,现在可以在 win32线程模式下使用一些 C + + 11 std: : 线程。这些只包含头部的适配器对我来说非常有用: Https://github.com/meganz/mingw-std-threads

从修订历史来看,似乎最近有人试图将其作为 mingw64运行时的一部分。

@ rubenvb 回答完全正确,如果您想使用 std::threadstd::mutex等,请使用 mingw posx 编译器。对于所有使用 CMake 的人,这里有一个例子:

set(CMAKE_CXX_STANDARD 17) # or 20 if you want..
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(THREADS_PREFER_PTHREAD_FLAG ON)


set(TOOLCHAIN_PREFIX x86_64-w64-mingw32)


set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc-posix)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++-posix)
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)


set(CMAKE_FIND_ROOT_PATH
/usr/${TOOLCHAIN_PREFIX}
)

理想的交叉编译 Linux 应用程序到 Windows。

提示: 适用于使用 GTK3并希望将 GTK 应用程序交叉编译到 Windows 的用户。你可能需要下载 Mingw Windows GTK 包,从 msys2.org 下载并打包,这样你就不需要下载了。 < a href = “ https://gitlab.melroy.org/melroy/GTK-3-bundle-for-Windows”rel = “ nofollow norefrer”> https://gitlab.melroy.org/melroy/GTK-3-bundle-for-Windows