mingw-w64线程:posix vs win32

我正在Windows上安装mingw-w64,有两个选项:win32线程和posix线程。我知道win32线程和pthread之间有什么区别,但是我不明白这两个选项之间有什么区别。我怀疑如果我选择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线程。但是用什么呢?


海绵宝宝撒
浏览 5808回答 3
3回答

红颜莎娜

GCC附带了一个编译器运行时库(libgcc),用于(除其他外)它以其支持的语言为多线程相关功能提供了低级的OS抽象。最相关的示例是libstdc ++的C ++ 11&nbsp;<thread>,<mutex>和<future>,当使用内部Win32线程模型构建GCC时,它们没有完整的实现。MinGW-w64提供了一个winpthreads(在Win32多线程API之上的pthreads实现),GCC可以将其链接以启用所有高级功能。我必须强调,这个选项并不禁止你写你想要的任何代码(它绝对NO什么API,你可以在你的代码中调用影响)。它仅反映GCC的运行时库(libgcc / libstdc ++ / ...)使用的功能。@James引用的警告与GCC的内部线程模型无关,而与Microsoft的CRT实现无关。总结一下:posix:启用C ++ 11 / C11多线程功能。使libgcc依赖libwinpthreads,以便即使您不直接调用pthreads API,也将分发winpthreads DLL。与您的应用程序一起分发一个DLL没有错。win32:没有C ++ 11多线程功能。都不会影响任何调用Win32 API或pthreads API的用户代码。您可以同时使用两者。

墨色风雨

GCC运行时的某些部分(尤其是异常处理)取决于所使用的线程模型。因此,如果您使用的是由POSIX线程构建的运行时版本,但决定使用Win32 API在自己的代码中创建线程,则可能会遇到问题。即使您使用运行时的Win32线程版本,您也可能不应该直接调用Win32 API。引用MinGW常见问题解答:由于MinGW使用Windows附带的标准Microsoft C运行时库,因此应小心并使用正确的函数来生成新线程。特别是,该CreateThread函数将无法为C运行时库正确设置堆栈。您应该改用_beginthreadex(几乎)与完全兼容的CreateThread。
打开App,查看更多内容
随时随地看视频慕课网APP