標籤:user 通過 mes 異常 支援 選項 data 運行時 dep
我正在安裝 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++ <thread>,<mutex>,<future>, 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
--------------------------------------------------------------------------------------------------------------------------
我在Windows上安裝mingw-w64,有兩個選項:win32線程和posix線程。 我知道什麼是win32線程和pthreads之間的區別,但我不明白這兩個選項之間的區別是什麼。 我懷疑,如果我會選擇posix線程,它會阻止我調用像CreateThread WinAPI函數。
看來這個選項指定哪個線程API將被一些程式或庫使用,但是通過什嗎? 通過海灣合作委員會,libstdc ++或其他?
我發現這個: 在windows的gcc連接埠thread_posixs和thread_win32之間有什麼區別?
總之,對於這個版本的mingw,threads-posix版本將使用posix API並允許使用std :: thread,並且threads-win32將使用win32 API,並禁用std :: thread的部分標準。
好的,如果我將選擇win32線程,那麼std :: thread將不可用,但仍將使用win32線程。 但是用什嗎?
GCC帶有一個編譯器運行庫(libgcc),它用於(除其他外)提供一個底層作業系統抽象,用於支援多語言相關功能。 最相關的例子是libstdc ++的C ++ 11 <thread> , <mutex>和<future> ,當使用內部的Win32執行緒模式構建GCC時,沒有完整的實現。 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的使用者代碼都沒有影響。 你可以一直使用兩者。
GCC運行時的一部分(尤其是異常處理)依賴於正在使用的執行緒模式。 因此,如果您使用的是使用POSIX線程構建的運行時版本,但是決定使用Win32 API在自己的代碼中建立線程,則可能在某個時候出現問題。
即使使用運行時的Win32線程版本,也可能不應該直接調用Win32 API。 從MinGW常見問題引用:
由於MinGW使用Windows附帶的標準Microsoft C執行階段程式庫,所以應該小心並使用正確的函數來產生新的線程。 特別是, CreateThread函數不會為C執行階段程式庫正確設定堆棧。 您應該使用_beginthreadex ,而(幾乎)與CreateThread完全相容。
請注意,現在可以在win32線程模式下使用一些C ++ 11 std :: thread。 這些僅供頭部使用的適配器為我開箱即用: https : //github.com/meganz/mingw-std-threads
從修訂曆史看來,最近有一些嘗試將其作為mingw64運行時的一部分。
https://code.i-harness.com/zh-CN/q/1071994
mingw-w64執行緒模式:posix vs win32(posix允許使用c++11的std:: thread,但要帶一個winpthreads,可能需要額外dll)