mingw-w64 konuları: posix vs win32


129

Windows'a mingw-w64 kuruyorum ve iki seçenek var: win32 thread ve posix thread. Win32 iş parçacıkları ve pthreads arasındaki farkın ne olduğunu biliyorum, ancak bu iki seçenek arasındaki farkın ne olduğunu anlamıyorum. Posix iş parçacığını seçersem, bunun CreateThread gibi WinAPI işlevlerini çağırmamı engelleyeceğinden şüpheliyim.

Görünüşe göre bu seçenek, hangi iş parçacığı API'sinin bir program veya kitaplık tarafından kullanılacağını belirtiyor, ama ne tarafından? GCC, libstdc ++ veya başka bir şeyle mi?

Bunu buldum: gcc windows portunda thread_posixs ve thread_win32 arasındaki fark nedir?

Kısacası, mingw'nin bu sürümü için, thread-posix sürümü posix API'sini kullanacak ve std :: thread kullanımına izin verecek ve thread-win32 win32 API'sini kullanacak ve std :: thread bölümünü devre dışı bırakacaktır. standart.

Tamam, eğer win32 iş parçacığını seçersem std :: iş parçacığı kullanılamayacak ancak win32 iş parçacığı kullanılmaya devam edecek. Ama ne tarafından kullanılıyor?


Bu gcc kullanılarak oluşturulan uygulamalar tarafından kullanılır .
devnull

@devnull, bu kullanacağım API tarafından belirlenmiyor mu? MinGW'nin pthreads sürümünü seçersem, iş parçacıkları için WinAPI kullanmamı ne engelleyecek?
Simon

gcc sizi engelleyecek ya da daha doğrusu dengesizleşecek
jiggunjer

Yanıtlar:


124

GCC, desteklediği dillerde çok iş parçacıklı ilgili işlevsellik için düşük düzeyde bir işletim sistemi soyutlaması sağlamak için (diğer şeylerin yanı sıra) kullandığı bir derleyici çalışma zamanı kitaplığı (libgcc) ile birlikte gelir. En alakalı örnektir libstdc ++ 'ın C ++ 11 <thread>, <mutex>ve <future>, GCC iç Win32 parçacığı modeli ile inşa edildiğinde tam bir uygulama bizde olmayan. MinGW-w64, GCC'nin tüm süslü özellikleri etkinleştirmek için daha sonra bağlanabileceği bir winpthreads (Win32 çok iş parçacıklı API'nin üstünde bir pthreads uygulaması) sağlar.

Bu seçeneğin istediğiniz herhangi bir kodu yazmanızı yasaklamadığını vurgulamalıyım ( kodunuzda arayabileceğiniz API üzerinde kesinlikle HİÇBİR etkisi yoktur). Yalnızca GCC'nin çalışma zamanı kitaplıklarının (libgcc / libstdc ++ / ...) işlevleri için kullandıklarını yansıtır. @ James tarafından alıntılanan uyarı, GCC'nin dahili iş parçacığı modeliyle değil, Microsoft'un CRT uygulamasıyla ilgisi var.

Özetlemek:

  • posix: C ++ 11 / C11 çoklu okuma özelliklerini etkinleştirin. Libgcc'yi libwinpthreads'e bağımlı kılar, böylece doğrudan pthreads API'sini çağırmasanız bile winpthreads DLL'yi dağıtıyorsunuz. Uygulamanızla bir DLL daha dağıtmanın yanlış bir tarafı yoktur.
  • win32: C ++ 11 çoklu okuma özelliği yok.

Win32 API'leri veya pthreads API'lerini çağıran herhangi bir kullanıcı kodu üzerinde hiçbir etkisi yoktur. Her zaman ikisini birden kullanabilirsiniz.


7
Her zaman gcc çalışma zamanını ve winpthreads'i statik olarak bağlayarak DLL eklenmesi gerekliliğini ortadan kaldırabilirsiniz.
Alexander Shishenko

3
O kadar halinde başkasının yardımcı olur, Linux üzerinde karşılık gelen seçeneği bulmak için biraz zaman aldı: paket g++-mingw-w64-x86-64iki dosya sağlar x86_64-w64-mingw32-g++-win32ve x86_64-w64-mingw32-g++-posixve x86_64-w64-mingw32-g++bunlardan biri, diğer ad olarak; bakın update-alternatives --display x86_64-w64-mingw32-g++.
stewbasic

Hmm, diyorsunuz ki "... GCC dahili Win32 iş parçacığı modeli ile inşa edildiğinde tam bir uygulamaya sahip değildir .... MinGW-w64, GCC'nin yapabileceği bir winpthreads (Win32 multithreading API'sinin üstünde bir pthreads uygulaması) sağlar ardından tüm süslü özellikleri etkinleştirmek için bağlantı kurun. " Öyleyse, win32 modelini seçersem, GCC yine de tüm özellikleri etkinleştirebilir, çünkü winpthreads kullanıyor mu? Ancak aşağıdaki madde iminde "win32: No C ++ 11 multithreading features" yazıyorsunuz. Ben anlamıyorum Ben eğer ortalama "GCC ardından ... lütfen bağlayabilirsiniz" mu yok win32 seçmek, bu seçebileceği ...?
Johannes Schaub -

@ JohannesSchaub-litb Evet, hayır. GCC'nin yapılandırma büyüsü, dahili iş parçacığı modeli seçimini libstdc ++ 'nın etkinleştirilmiş özellikleriyle birleştirir, çünkü ikincisi GCC'nin dahili "gthread" sarmalayıcısının (bu sadece ince bir posix benzeri iş parçacığı soyutlamasıdır. C ++ 11 özelliklerinin temel parçaları eksiktir) Eğer kullandığınız katmanda --threads=win32. eksik bitleri GCC uygulanmadı Yani sürece, sen ile GCC yapılandırmanız gerekir --threads=win32.
rubenvb

-Win32 kullanan qt'nin mingw önceden derlenmiş kitaplıklarını -posix kullanan diğer kitaplıklarla birlikte kullanabilir ve her iki kitaplığı da aynı programda kullanabilir miyim?
Johannes Schaub -

16

GCC çalışma zamanının bölümleri (özellikle istisna işleme), kullanılan iş parçacığı modeline bağlıdır. Bu nedenle, POSIX iş parçacıklarıyla oluşturulmuş çalışma zamanı sürümünü kullanıyorsanız, ancak Win32 API'leri ile kendi kodunuzda iş parçacıkları oluşturmaya karar verirseniz, bir noktada sorun yaşarsınız.

Çalışma zamanının Win32 iş parçacığı sürümünü kullanıyor olsanız bile, muhtemelen Win32 API'lerini doğrudan çağırmamalısınız. MinGW SSS'den alıntı :

MinGW, Windows ile birlikte gelen standart Microsoft C çalışma zamanı kitaplığını kullandığından, yeni bir iş parçacığı oluşturmak için dikkatli olmanız ve doğru işlevi kullanmanız gerekir. Özellikle, CreateThreadişlev yığını C çalışma zamanı kitaplığı için doğru şekilde ayarlamaz. Bunun _beginthreadexyerine (neredeyse) tamamen uyumlu olan kullanmalısınız CreateThread.


7
Bu durumda, boost veya Qt gibi 3. taraf kitaplıkları iş parçacığı ne olacak? Bu kitaplıkları mingw64 ile bunların temelindeki iş parçacığı kitaplığını bulmak zorunda kalmadan kullanmanın bir yolu var mı? Yükseltme :: thread'i mingw'nin posix varyantı ile keyfi olarak kullanmaya karar verirsem ne olur?
tantuni

1
@ user460153 biraz bilgi qt-project.org/wiki/…
Alex V.

10
Bu cevap yanlış. GCC çalışma zamanının Win32 API'leri üzerinde kesinlikle hiçbir etkisi yoktur.
rubenvb

Bağlantılı SSS girişini okuyun. Bu cevap doğrudur.
Daira Hopwood

13

Win32 iş parçacığı modunda C ++ 11 std :: iş parçacığının bazılarını kullanmanın artık mümkün olduğunu unutmayın. Bu yalnızca başlık adaptörleri benim için kutudan çıktı: https://github.com/meganz/mingw-std-threads

Revizyon geçmişinden, bunu mingw64 çalışma zamanının bir parçası yapmak için son zamanlarda bazı girişimlerde bulunulmuş gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.