темы mingw-w64: posix vs win32

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

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

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

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

Ok, если я выберу win32 threads, то std:: thread будет недоступно, но потоки win32 по-прежнему будут использоваться. Но используется кем?

3 ответов


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

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

для подведем итог:

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

ни имеют влияние на любой пользовательский код, вызывающий Win32 APIs или Pthreads APIs. Вы всегда можете использовать оба.


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

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

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


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

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