Я устанавливаю mingw-w64 в Windows, и есть два варианта: потоки win32 и потоки posix. Я знаю, в чем разница между потоками win32 и pthreads, но я не понимаю, в чем разница между этими двумя вариантами. Я сомневаюсь, что если я выберу потоки posix, это помешает мне вызывать функции WinAPI, такие как CreateThread.
Кажется, что эта опция указывает, какой API потоковой передачи будет использоваться какой-либо программой или библиотекой, но чем? GCC, libstdc ++ или что-то еще?
Я нашел это: В чем разница между thread_posixs и thread_win32 в gcc-порте окон?
Короче говоря, для этой версии mingw выпуск thread-posix будет использовать posix API и разрешить использование std :: thread, а thread-win32 будет использовать win32 API и отключить часть std :: thread в стандарт.
Хорошо, если я выберу потоки win32, то std :: thread будет недоступен, но потоки win32 все равно будут использоваться. Но чем используется?
Ответы:
GCC поставляется с библиотекой времени выполнения компилятора (libgcc), которую он использует (среди прочего) для обеспечения низкоуровневой абстракции ОС для функциональности, связанной с многопоточностью, на поддерживаемых им языках. Наиболее подходящим примером является C ++ 11
<thread>
, libstdc ++<mutex>
, и<future>
, который не имеет полной реализации, когда GCC построен с его внутренней потоковой моделью Win32. MinGW-w64 предоставляет winpthreads (реализация pthreads поверх многопоточного API Win32), которую GCC может затем подключить, чтобы включить все необычные функции.Я должен подчеркнуть, что этот параметр не запрещает вам писать любой код, который вы хотите (он абсолютно НЕ влияет на то, какой API вы можете вызывать в своем коде). Он отражает только то, что библиотеки времени выполнения GCC (libgcc / libstdc ++ / ...) используют для своей функциональности. Предостережение, процитированное @James, не имеет ничего общего с внутренней потоковой моделью GCC, а скорее с реализацией Microsoft CRT.
Подвести итоги:
posix
: включить функции многопоточности C ++ 11 / C11. Делает libgcc зависимой от libwinpthreads, так что даже если вы не вызываете напрямую API pthreads, вы будете распространять DLL winpthreads. Нет ничего плохого в том, чтобы вместе с вашим приложением распространить еще одну DLL.win32
: Нет функций многопоточности C ++ 11.Ни один из них не влияет на какой-либо пользовательский код, вызывающий API Win32 или API pthreads. Вы всегда можете использовать оба.
источник
g++-mingw-w64-x86-64
предоставляет два файла,x86_64-w64-mingw32-g++-win32
иx86_64-w64-mingw32-g++-posix
, иx86_64-w64-mingw32-g++
является псевдонимом для одного из них; смupdate-alternatives --display x86_64-w64-mingw32-g++
.--threads=win32
. Так что, пока недостающие биты не реализованы в GCC, вы должны настроить GCC с помощью--threads=win32
.Части среды выполнения GCC (в частности, обработка исключений) зависят от используемой модели потоковой передачи. Итак, если вы используете версию среды выполнения, которая была построена с потоками POSIX, но решите создать потоки в своем собственном коде с помощью API-интерфейсов Win32, в какой-то момент у вас могут возникнуть проблемы.
Даже если вы используете потоковую версию среды выполнения Win32, вам, вероятно, не следует напрямую вызывать Win32 API. Цитата из FAQ MinGW :
источник
Обратите внимание, что теперь можно использовать некоторые из C ++ 11 std :: thread в режиме потоковой передачи win32. Эти адаптеры только для заголовков работали для меня из коробки: https://github.com/meganz/mingw-std-threads
Из истории изменений похоже, что это была недавняя попытка сделать это частью среды выполнения mingw64.
источник