Pertanyaan benang mingw-w64: posix vs win32


Saya menginstal mingw-w64 pada Windows dan ada dua opsi: win32 thread dan thread posix. Saya tahu apa perbedaan antara win32 thread dan pthreads tetapi saya tidak mengerti apa perbedaan antara dua opsi ini. Saya ragu bahwa jika saya akan memilih thread posix itu akan mencegah saya memanggil fungsi WinAPI seperti CreateThread.

Tampaknya opsi ini menentukan API threading mana yang akan digunakan oleh beberapa program atau pustaka, tetapi dengan apa? Oleh GCC, libstdc ++ atau oleh sesuatu yang lain?

Aku menemukan ini: Apa perbedaan antara thread_posixs dan thread_win32 di gcc port windows?

Singkatnya, untuk versi mingw ini, rilis thread-posix akan menggunakan API posix dan memungkinkan penggunaan std :: thread, dan untaian-win32 akan menggunakan API win32, dan menonaktifkan std :: thread bagian dari standar.

Ok, jika saya akan memilih win32 threads maka std :: thread tidak akan tersedia tetapi win32 thread masih akan digunakan. Tetapi digunakan oleh apa?


76
2018-06-21 19:01


asal


Jawaban:


GCC dilengkapi dengan pustaka runtime kompilator (libgcc) yang digunakan untuk (antara lain) menyediakan abstraksi OS tingkat rendah untuk fungsionalitas multithreading terkait dalam bahasa yang didukungnya. Contoh yang paling relevan adalah libstdc ++'s C ++ 11 <thread>, <mutex>, dan <future>, yang tidak memiliki implementasi lengkap ketika GCC dibangun dengan model threading Win32 internal. MinGW-w64 menyediakan winpthreads (implementasi pthreads di atas Win32 multithreading API) yang kemudian dapat dihubungkan dengan GCC untuk mengaktifkan semua fitur mewah.

Saya harus menekankan opsi ini tidak melarang Anda untuk menulis kode yang Anda inginkan (itu benar-benar TIDAK pengaruh pada API apa yang dapat Anda panggil dalam kode Anda). Ini hanya mencerminkan apa yang digunakan oleh perpustakaan runtime GCC (libgcc / libstdc ++ / ...) untuk fungsinya. 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 langsung memanggil pthreads API, Anda akan mendistribusikan DLL winpthreads. Tidak ada yang salah dengan mendistribusikan satu DLL lagi dengan aplikasi Anda.
  • win32: Tidak ada C ++ 11 fitur multithreading.

Tidak ada pengaruh pada setiap kode pengguna yang memanggil API Win32 atau API pthreads. Anda selalu dapat menggunakan keduanya.


65
2018-05-22 07:00



Bagian dari runtime GCC (penanganan pengecualian, khususnya) tergantung pada model threading yang digunakan. Jadi, jika Anda menggunakan versi runtime yang dibangun dengan benang POSIX, tetapi memutuskan untuk membuat untaian di kode Anda sendiri dengan API Win32, Anda mungkin mengalami masalah di beberapa titik.

Bahkan jika Anda menggunakan Win32 versi threading dari runtime, Anda mungkin tidak seharusnya memanggil Win32 API secara langsung. Mengutip dari FAQ MinGW:

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


15
2018-06-22 19:13



Perhatikan bahwa sekarang mungkin untuk menggunakan beberapa C ++ 11 std :: thread pada mode win32 winading. Adaptor tajuk-satunya ini bekerja di luar kotak untuk saya: https://github.com/meganz/mingw-std-threads

Dari sejarah revisi sepertinya ada beberapa upaya terakhir untuk menjadikan ini bagian dari runtime mingw64.


10
2017-09-19 15:32