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

我正在安裝 mingw-w64 on Windows,有兩個選項: win32線程和posix線程。 我知道win32線程和pthreads之間的區別,可是我不明白這兩個選項之間的區別。 我懷疑若是我選擇了posix線程,它將阻止我調用像CreateThread這樣的WinAPI函數。c++

彷佛這個選項指定了哪一個程序或者庫將使用哪一個線程 API,但經過什麼? 由 GCC,libstdc++或者其餘事物?git

我發現:什麼區別thread_posixs和 thread_win32 gcc Windows 港?github

簡而言之,對於這個版本的mingw,threads-posix發行版將使用 posix API並容許使用 std:: thread,threads-win32將使用 win32api,並禁用標準的std::thread 部分。windows

好的,若是我選擇win32線程,那麼 std::thread 將不可用,可是win32線程仍將被使用。 可是用什麼?api

 

 

gcc運行時( 特殊的異常處理)的部分依賴於正在使用的線程模型。 所以,若是你使用的是使用posix線程構建的運行時版本,但決定在你本身的代碼中使用 win32 api建立線程,那麼你可能會遇到一些問題。多線程

即便你正在使用運行時的win32線程版本,你可能也不該該直接調用 win32 api 。 引用來自 MinGW常見問題解答:函數

因爲MinGW使用了 Windows 附帶的標準Microsoft運行時庫,因此你應該當心並使用正確的函數來生成一個新的線程。 CreateThread 函數將不會正確地爲運行時庫設置堆棧。 你應該使用 _beginthreadex,它是( 幾乎幾乎) 徹底兼容 CreateThread 。post

 

 

GCC附帶了一個編譯器運行時庫( 宋體),它使用( 其中之一) 提供了一個用於在它的支持的語言中實現多線程相關功能的。 最相關的例子是 C++11 libstdc++ <thread><mutex><future>, gcc時沒有一個完整的實現了其內部win32線程模型。 MinGW-w64提供了 winpthreads ( Win32多線程API之上的一個pthreads實現),GCC能夠連接它來啓用全部的奇妙特性。spa

我必須強調這裏選項不容許你編寫任何你想要的代碼( 對於你能夠在代碼中調用的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

相關文章
相關標籤/搜索