为了账号安全,请及时绑定邮箱和手机立即绑定

mingw-w64线程:posix vs win32

mingw-w64线程:posix vs win32

海绵宝宝撒 2019-12-12 14:45:43
我正在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线程。但是用什么呢?
查看完整描述

3 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

GCC附带了一个编译器运行时库(libgcc),用于(除其他外)它以其支持的语言为多线程相关功能提供了低级的OS抽象。最相关的示例是libstdc ++的C ++ 11 <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的用户代码。您可以同时使用两者。


查看完整回答
反对 回复 2019-12-12
?
墨色风雨

TA贡献1853条经验 获得超6个赞

GCC运行时的某些部分(尤其是异常处理)取决于所使用的线程模型。因此,如果您使用的是由POSIX线程构建的运行时版本,但决定使用Win32 API在自己的代码中创建线程,则可能会遇到问题。


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


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


查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 5784 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信