MinGW-w64 темы: posix vs win32



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



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



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




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




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

833   3  

3 ответов:

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

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

To подведем итог:

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

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

части среды выполнения 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.

Comments

    Ничего не найдено.