Mingw-w64 темы: posix vs win32

Я устанавливаю mingw-w64 в Windows, и есть два варианта: win32 threads и posix threads. Я знаю, в чем разница между нитями win32 и pthreads, но я не понимаю, в чем разница между этими двумя параметрами. Я сомневаюсь, что если я выберу потоки posix, это помешает мне вызвать функции WinAPI, такие как CreateThread.

Кажется, что этот параметр указывает, какой API потоковой передачи будет использоваться какой-либо программой или библиотекой, но что? По GCC, libstdС++ или чем-то еще?

Я нашел это: В чем разница между thread_posixs и thread_win32 в gcc-порту Windows?

Короче говоря, для этой версии mingw релиз thread-posix будет использовать API posix и разрешить использование std:: thread, а thread-win32 будет использовать API win32 и отключить std:: thread часть стандарта.

Хорошо, если я выберу потоки win32, то std:: thread будет недоступен, но нити win32 все равно будут использоваться. Но используется ли что?

Ответ 1

GCC поставляется с библиотекой времени выполнения компилятора (libgcc), которую он использует для (помимо прочего) для низкоуровневой абстракции ОС для многопоточности связанных функций на поддерживаемых им языках. Наиболее важным примером является libstdС++ С++ 11 <thread>, <mutex> и <future>, которые не имеют полной реализации, когда GCC построен с внутренней моделью потоковой Win32. MinGW-w64 предоставляет winpthreads (реализация pthreads поверх API многопоточности Win32), который GCC может затем подключить, чтобы включить все причудливые функции.

Я должен подчеркнуть, что этот вариант не запрещает вам писать любой код, который вы хотите (он имеет абсолютно НЕТ влияние на то, какой API вы можете вызвать в своем коде). Он отражает только те библиотеки времени выполнения GCC (libgcc/libstdС++/...) для их функциональности. Оговорка, цитируемая @James, не имеет ничего общего с внутренней потоковой моделью GCC, а скорее с реализацией Microsoft CRT.

Подводя итог:

  • posix: включить многопоточность С++ 11/C11. Заставляет libgcc зависеть от libwinpthreads, так что даже если вы напрямую не используете API pthreads, вы будете распространять DLL winpthreads. Там нет ничего плохого в распространении еще одной DLL с вашим приложением.
  • win32: Нет многопоточных функций С++ 11.

Ни одно из них не влияет на любой пользовательский код, вызывающий API Win32 или API-интерфейсы pthreads. Вы всегда можете использовать оба.

Ответ 2

Части среды выполнения GCC (в частности, обработка исключений) зависят от используемой модели потоковой передачи. Итак, если вы используете версию среды выполнения, которая была построена с потоками POSIX, но решили создать потоки в вашем собственном коде с помощью API Win32, у вас могут возникнуть проблемы в какой-то момент.

Даже если вы используете поточную версию Win32 для выполнения, вы, вероятно, не должны напрямую обращаться к API Win32. Цитирование из Часто задаваемые вопросы MinGW:

Поскольку MinGW использует стандартную библиотеку времени исполнения Microsoft C, которая поставляется с Windows, вы должны быть осторожны и использовать правильную функцию для генерации нового потока. В частности, функция CreateThread не будет правильно устанавливать стек для библиотеки времени выполнения C. Вместо этого вы должны использовать _beginthreadex, который (почти) полностью совместим с CreateThread.

Ответ 3

Обратите внимание, что теперь можно использовать некоторые из потоков std:: С++ 11 в потоковом режиме win32. Эти адаптеры, предназначенные только для заголовка, для меня были ясны: https://github.com/meganz/mingw-std-threads

Из истории ревизий похоже, что есть недавняя попытка сделать это частью среды выполнения mingw64.