Saya menginstal mingw-w64 di Windows dan ada dua opsi: utas win32 dan utas posix. Saya tahu apa perbedaan antara utas win32 dan pthreads tetapi saya tidak mengerti apa perbedaan antara kedua opsi ini. Saya ragu jika saya akan memilih utas posix, itu akan mencegah saya memanggil fungsi WinAPI seperti CreateThread.
Tampaknya opsi ini menentukan API penguliran mana yang akan digunakan oleh beberapa program atau pustaka, tetapi oleh apa? Oleh GCC, libstdc ++ atau oleh yang lainnya?
Saya menemukan ini: Apa perbedaan antara thread_posixs dan thread_win32 di gcc port of windows?
Singkatnya, untuk versi mingw ini, rilis threads-posix akan menggunakan API posix dan mengizinkan penggunaan std :: thread, dan threads-win32 akan menggunakan win32 API, dan menonaktifkan bagian std :: thread dari standar.
Ok, jika saya akan memilih utas win32 maka std :: utas tidak akan tersedia tetapi utas win32 masih akan digunakan. Tapi digunakan oleh apa?
Jawaban:
GCC hadir dengan pustaka runtime kompiler (libgcc) yang digunakannya untuk (antara lain) menyediakan abstraksi OS tingkat rendah untuk fungsionalitas terkait multithreading dalam bahasa yang didukungnya. Contoh yang paling relevan adalah libstdc ++'s C ++ 11
<thread>
,,<mutex>
dan<future>
, yang tidak memiliki implementasi lengkap saat GCC dibuat dengan model threading Win32 internalnya. MinGW-w64 menyediakan winpthreads (implementasi pthreads di atas API multithreading Win32) yang kemudian dapat ditautkan oleh GCC untuk mengaktifkan semua fitur mewah.Saya harus menekankan bahwa opsi ini tidak melarang Anda untuk menulis kode apa pun yang Anda inginkan (ini sama sekali TIDAK memengaruhi API apa yang dapat Anda panggil dalam kode Anda). Ini hanya mencerminkan apa yang digunakan oleh pustaka waktu proses GCC (libgcc / libstdc ++ / ...) untuk fungsionalitasnya. Peringatan yang dikutip oleh @James tidak ada hubungannya dengan model threading internal GCC, melainkan dengan implementasi CRT Microsoft.
Untuk meringkas:
posix
: mengaktifkan fitur multithreading C ++ 11 / C11. Membuat libgcc bergantung pada libwinpthreads, sehingga meskipun Anda tidak secara langsung memanggil API pthreads, Anda akan mendistribusikan DLL winpthreads. Tidak ada yang salah dengan mendistribusikan satu DLL lagi dengan aplikasi Anda.win32
: Tidak ada fitur multithreading C ++ 11.Keduanya tidak memiliki pengaruh pada kode pengguna yang memanggil Win32 API atau pthreads API. Anda selalu bisa menggunakan keduanya.
sumber
g++-mingw-w64-x86-64
menyediakan dua filex86_64-w64-mingw32-g++-win32
danx86_64-w64-mingw32-g++-posix
, dan denganx86_64-w64-mingw32-g++
alias salah satunya; lihatupdate-alternatives --display x86_64-w64-mingw32-g++
.--threads=win32
. Selama bit yang hilang tidak diterapkan di GCC, Anda harus mengonfigurasi GCC dengan--threads=win32
.Bagian dari runtime GCC (penanganan pengecualian, khususnya) bergantung pada model penguliran yang digunakan. Jadi, jika Anda menggunakan versi runtime yang dibangun dengan utas POSIX, tetapi memutuskan untuk membuat utas dalam kode Anda sendiri dengan Win32 API, Anda kemungkinan akan mengalami masalah di beberapa titik.
Bahkan jika Anda menggunakan versi runtime Win32 threading, Anda mungkin tidak boleh memanggil API Win32 secara langsung. Mengutip dari MinGW FAQ :
sumber
Perhatikan bahwa sekarang dimungkinkan untuk menggunakan beberapa C ++ 11 std :: thread dalam mode win32 threading. Adaptor khusus header ini bekerja di luar kotak untuk saya: https://github.com/meganz/mingw-std-threads
Dari riwayat revisi, sepertinya ada beberapa upaya baru-baru ini untuk menjadikannya bagian dari runtime mingw64.
sumber