mingw-w64線程模型:posix vs win32(posix允許使用c++11的std:: thread,但要帶一個winpthreads,可能需要額外dll)


我正在安裝 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM