utas mingw-w64: posix vs win32

129

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?

Simon
sumber
Digunakan oleh aplikasi yang dibuat menggunakan gcc ini .
devnull
@devnull, bukankah ini ditentukan oleh API yang akan saya gunakan? Jika saya akan memilih versi pthreads dari MinGW, lalu apa yang akan mencegah saya menggunakan WinAPI untuk utas?
Simon
gcc akan mencegah Anda, atau lebih tepatnya: menjadi tidak stabil
jiggunjer

Jawaban:

124

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.

rubenvb.dll
sumber
7
Anda selalu dapat menautkan runtime gcc dan winpthreads secara statis, menghilangkan perlunya penyertaan DLL.
Alexander Shishenko
3
Butuh beberapa saat bagi saya untuk menemukan opsi yang sesuai di Linux, jadi jika itu membantu orang lain: Paket ini g++-mingw-w64-x86-64menyediakan dua file x86_64-w64-mingw32-g++-win32dan x86_64-w64-mingw32-g++-posix, dan dengan x86_64-w64-mingw32-g++alias salah satunya; lihat update-alternatives --display x86_64-w64-mingw32-g++.
stewbasic
Hmm, Anda mengatakan "... yang tidak memiliki implementasi lengkap saat GCC dibuat dengan model internal win32 threading .... MinGW-w64 menyediakan winpthreads (implementasi pthreads di atas API multithreading Win32) yang dapat dilakukan GCC lalu tautkan untuk mengaktifkan semua fitur mewah. " Jadi jika saya memilih model win32, GCC masih dapat mengaktifkan semua fitur, karena menggunakan winpthreads? Namun pada poin di bawah, Anda menulis "win32: Tidak ada fitur multithreading C ++ 11". Saya tidak mengerti. Apakah "GCC mana yang dapat ditautkan ke ..." berarti bahwa jika saya tidak memilih win32, maka dapat memilih ...?
Johannes Schaub - litb
@ JohannesSchaub-litb Nah, tidak. Sihir konfigurasi GCC memasangkan pilihan model utas internal ke fitur yang diaktifkan libstdc ++ karena fitur yang terakhir dibangun di atas pembungkus "gthread" internal GCC (yang hanya abstraksi utas tipis seperti posix. Bagian dasar untuk fitur C ++ 11 tidak ada di lapisan tersebut saat Anda menggunakan --threads=win32. Selama bit yang hilang tidak diterapkan di GCC, Anda harus mengonfigurasi GCC dengan --threads=win32.
rubenvb
Dapatkah saya menggunakan pustaka yang dikompilasi mingw qt, yang menggunakan -win32, dengan pustaka lain yang menggunakan -posix, dan menggunakan kedua pustaka dalam program yang sama?
Johannes Schaub - litb
16

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 :

Karena MinGW menggunakan pustaka runtime Microsoft C standar yang disertakan dengan Windows, Anda harus berhati-hati dan menggunakan fungsi yang benar untuk membuat utas baru. Secara khusus, CreateThreadfungsi tidak akan menyiapkan tumpukan dengan benar untuk pustaka runtime C. Anda harus menggunakan _beginthreadexsebagai gantinya, yang (hampir) sepenuhnya kompatibel dengan CreateThread.

James Holderness
sumber
7
Dalam kasus ini, bagaimana dengan pustaka threading pihak ketiga seperti boost atau Qt? Apakah ada cara untuk menggunakan pustaka ini dengan mingw64 tanpa harus mencari tahu pustaka threading yang mendasarinya? Apa yang akan terjadi jika saya secara sewenang-wenang memutuskan untuk menggunakan boost :: threads dengan varian posix dari mingw?
tantuni
1
@ user460153 beberapa info qt-project.org/wiki/…
Alex V.
10
Jawaban ini salah. Runtime GCC sama sekali tidak berpengaruh pada Win32 API.
rubenvb
Baca entri FAQ terkait. Jawaban ini benar.
Daira Hopwood
13

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.

Tom 7
sumber