Sim*_*mon 103 windows gcc mingw pthreads
我正在Windows上安装mingw-w64,有两个选项:win32线程和posix线程.我知道win32线程和pthreads之间的区别是什么,但我不明白这两个选项之间的区别.我怀疑如果我选择posix线程,它将阻止我调用WinTI函数,如CreateThread.
看来这个选项指定某些程序或库将使用哪个线程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线程.但用什么?
rub*_*nvb 100
GCC附带了一个编译器运行时库(libgcc),它用于(除其他外)为其支持的语言中的多线程相关功能提供低级OS抽象.最相关的例子是的libstdc ++的C++ 11 <thread>
,<mutex>
和<future>
,不具有完全实现时,GCC在其内部的Win32线程模型建立.MinGW-w64提供了一个winpthreads(在Win32多线程API之上的pthreads实现),GCC可以将其链接到其中以启用所有奇特的功能.
我必须强调这个选项并不禁止你编写你想要的任何代码(它对你可以在代码中调用的API 完全没有影响).它只反映了GCC的运行时库(libgcc/libstdc ++/...)用于其功能.@James引用的警告与GCC的内部线程模型无关,而是与微软的CRT实现有关.
总结一下:
posix
:启用C++ 11/C11多线程功能.使libgcc依赖于libwinpthreads,这样即使你不直接调用pthreads API,你也会分发winpthreads DLL.在您的应用程序中再分发一个DLL没有任何问题.win32
:没有C++ 11多线程功能.对调用Win32 API或pthreads API的任何用户代码都没有影响.你可以随时使用两者.
Jam*_*ess 15
GCC运行时的部分(特别是异常处理)取决于所使用的线程模型.因此,如果您使用的是使用POSIX线程构建的运行时版本,但决定使用Win32 API在您自己的代码中创建线程,那么您可能在某些时候遇到问题.
即使您使用的是运行时的Win32线程版本,也可能不应该直接调用Win32 API.引自MinGW FAQ:
由于MinGW使用Windows附带的标准Microsoft C运行时库,因此您应该小心并使用正确的函数来生成新线程.特别是,该
CreateThread
函数不会为C运行时库正确设置堆栈.您应该使用_beginthreadex
,它(几乎)完全兼容CreateThread
.
小智 11
请注意,现在可以在win32线程模式下使用一些C++ 11 std :: thread.这些仅限标头的适配器为我开箱即用:https: //github.com/meganz/mingw-std-threads
从修订历史记录看,最近有一些尝试将其作为mingw64运行时的一部分.
归档时间: |
|
查看次数: |
87593 次 |
最近记录: |