mingw-w64 потоки: posix против win32

129

Я устанавливаю 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.
devnull
@devnull, разве это не определено API, который я буду использовать? Если я выберу версию MinGW для pthreads, что помешает мне использовать WinAPI для потоков?
Саймон
gcc помешает вам, а точнее: станет нестабильным
jiggunjer 05

Ответы:

125

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. Вы всегда можете использовать оба.

rubenvb
источник
7
Вы всегда можете связать gcc runtime и winpthreads статически, исключив необходимость включения DLL.
Александр Шишенко
3
Мне потребовалось некоторое время, чтобы найти соответствующую опцию в Linux, так что на случай, если она поможет кому-то еще: пакет 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++.
stewbasic
Хм, вы говорите "... которые не имеют полной реализации, когда GCC построен с его внутренней моделью потоковой передачи Win32 .... MinGW-w64 предоставляет winpthreads (реализация pthreads поверх многопоточного API Win32), который GCC может затем сделайте ссылку, чтобы включить все необычные функции ". Итак, если я выберу модель win32, GCC все равно сможет включить все функции, потому что он использует winpthreads? Но в нижеследующем пункте вы пишете «win32: нет многопоточности в C ++ 11». Я не понимаю. Означает ли «какой GCC может затем связываться с ...», что если я не выберу win32, он сможет выбрать ...?
Йоханнес Шауб - лит
@ JohannesSchaub-litb Ну, нет. Магия конфигурации GCC связывает выбор модели внутреннего потока с включенными функциями libstdС ++, поскольку последняя построена поверх внутренней оболочки GCC gthread (которая представляет собой всего лишь тонкую абстракцию потока, подобную posix. Фундаментальные части для функций C ++ 11 отсутствуют на этом уровне при использовании --threads=win32. Так что, пока недостающие биты не реализованы в GCC, вы должны настроить GCC с помощью --threads=win32.
rubenvb
Могу ли я использовать предварительно скомпилированные библиотеки qt mingw, которые используют -win32, с другими библиотеками, которые используют -posix, и использовать обе библиотеки в одной программе?
Йоханнес Шауб - лит
16

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

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

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

Джеймс Холдернесс
источник
7
В этом случае, как насчет сторонних библиотек потоковой передачи, таких как boost или Qt? Есть ли способ использовать эти библиотеки с mingw64 без необходимости выяснять для них базовую библиотеку потоков? Что произойдет, если я произвольно решу использовать boost :: thread с вариантом mingw posix?
tantuni 06
1
@ user460153 немного информации qt-project.org/wiki/…
Alex V.
10
Это неверный ответ. Среда выполнения GCC абсолютно не влияет на API Win32.
rubenvb
Прочтите связанную запись в FAQ. Это правильный ответ.
Дайра Хопвуд,
13

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

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

Том 7
источник