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

來源:互聯網
上載者:User

標籤: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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.