MinGW-posix和win32糾纏的瓜娃子
法克油啊,讓我一個小白情何以堪。
盤TA
wiki posix
- wiki中文-UNIX API標准
wiki win32 暫且認定TA為win32API標准
他倆有啥糾葛呢
- 我來問問Google
good job 果然天下文章一大抄,我爸說的沒錯 No fuck u any more
- 看看寫的啥
我他娘的在win下裝明瓜娃64的時候有倆選項,win32和posix線程。win32線程和皮線程的差異我還是知道的,蛋疼的是這里的選項是個啥(心里話他娘的不會安裝旁邊給個hint啊)
讓我瑟瑟發抖的是,要是我選posix,鬼知道會不會讓我蛋疼的調用不了WINAPI,比如新增線程
我也去抄一抄
讀的有點膈應的翻譯:
我正在安裝 mingw-w64 on Windows,有兩個選項: win32線程和posix線程。 我知道win32線程和pthreads之間的區別,但是我不明白這兩個選項之間的區別。 我懷疑如果我選擇了posix線程,它將阻止我調用像CreateThread這樣的WinAPI函數。
似乎這個選項指定了哪個程序或者庫將使用哪個線程 API,但通過什么? 由 GCC,libstdc++或者其他事物?
我發現:什么區別thread_posixs和 thread_win32 gcc Windows 港?
解答如下:
簡而言之,對於這個版本的mingw,threads-posix發行版將使用 posix API並允許使用 std:: thread,threads-win32將使用 win32api,並禁用標准的std::thread 部分。
好的,如果我選擇win32線程,那么 std::thread 將不可用,但是win32線程仍將被使用。 但是用什么?
- gcc運行時( 特殊的異常處理)的部分依賴於正在使用的線程模型。 因此,如果你使用的是使用posix線程構建的運行時版本,但決定在你自己的代碼中使用 win32 api創建線程,那么你可能會遇到一些問題。
即使你正在使用運行時的win32線程版本,你可能也不應該直接調用 win32 api 。 引用來自 MinGW常見問題解答:
- 由於MinGW使用了 Windows 附帶的標准Microsoft運行時庫,所以你應該小心並使用正確的函數來生成一個新的線程。 CreateThread 函數將不會正確地為運行時庫設置堆棧。 你應該使用 _beginthreadex,它是( 幾乎幾乎) 完全兼容 CreateThread 。
GCC附帶了一個編譯器運行時庫( 宋體),它使用( 其中之一) 提供了一個用於在它的支持的語言中實現多線程相關功能的。 最相關的例子是 C++11 libstdc++, , , gcc時沒有一個完整的實現了其內部win32線程模型。 MinGW-w64提供了 winpthreads ( Win32多線程API之上的一個pthreads實現),GCC可以鏈接它來啟用所有的奇妙特性。
- 我必須強調這里選項不允許你編寫任何你想要的代碼( 對於你可以在代碼中調用的API,它有絕對的無影響) 。 它只反映了 (libgcc/libstdc++/...) 庫的使用了哪些運行時。 由 @James 引用的警告與gcc線程模型的內部無關,而是與microsoft實現的CRT有關。
總結:
posix: 啟用 c++11/c11多線程功能。 使depend依賴於 libwinpthreads,這樣即使你不直接調用 API,你將分發 winpthreads 。 使用應用程序分發一個DLL沒有什么問題。
win32: 沒有C++11多線程功能。
對任何調用 Win32 api或者 pthreads api的用戶代碼都不影響。 你可以同時使用兩個。
原作者:rubenvb
https://ask.helplib.com/windows/post_675746
大結局
posix和win32對我們日常開發沒啥影響,我看誰爽選哪個就好了。
--
另外調試選項sjlj和seh的你也可以用這個套路自己去扒一扒,大概就是調試性能和report方式啥的
吐槽sourceforge寫了洋洋灑灑的wiki咋就不寫這倆呢,ε=(´ο`*)))唉
如果你能用在線的installer就直接用,但我試了一下綠條條根本就不跑,選擇一下自己下包安裝啦。