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的用户代码。您可以同时使用两者。
TA贡献1853条经验 获得超6个赞
GCC运行时的某些部分(尤其是异常处理)取决于所使用的线程模型。因此,如果您使用的是由POSIX线程构建的运行时版本,但决定使用Win32 API在自己的代码中创建线程,则可能会遇到问题。
即使您使用运行时的Win32线程版本,您也可能不应该直接调用Win32 API。引用MinGW常见问题解答:
由于MinGW使用Windows附带的标准Microsoft C运行时库,因此应小心并使用正确的函数来生成新线程。特别是,该CreateThread函数将无法为C运行时库正确设置堆栈。您应该改用_beginthreadex(几乎)与完全兼容的CreateThread。
- 3 回答
- 0 关注
- 6194 浏览
添加回答
举报