mingw-w64 теми: posix vs win32


128

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

Здається, що цей параметр вказує, який API інтерфейсу буде використовуватися якоюсь програмою чи бібліотекою, але чим? За GCC, libstdc ++ чи чимось іншим?

Я виявив це: в чому різниця між thread_posixs та thread_win32 у порту gcc windows?

Коротше кажучи, для цієї версії mingw випуск теми-posix використовуватиме API-файл posix та дозволить використовувати std :: thread, а нитки-win32 використовуватимуть API Win32 та відключають частину std :: thread в стандартний.

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


Використовується програмами, створеними за допомогою цього gcc.
devnull

@devnull, чи не це визначається API, який я буду використовувати? Якщо я виберу pthreads версію MinGW, то що заважатиме мені використовувати WinAPI для потоків?
Саймон

gcc заважатиме тобі, а точніше: стати нестабільним
jiggunjer

Відповіді:


123

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

Слід наголосити, що цей варіант не забороняє вам писати будь-який код, який ви хочете (він абсолютно НЕ впливає на те, який API ви можете зателефонувати у своєму коді). Він відображає лише те, що бібліотеки часу виконання GCC (libgcc / libstdc ++ / ...) використовують для своєї функціональності. Застереження, яке цитує @James, не має нічого спільного з внутрішньою моделлю різьблення GCC, а швидше з впровадженням CRT Microsoft.

Узагальнити:

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

Ні вони не впливають на будь-який код користувача, що викликає API Win32 або API pthreads. Ви завжди можете використовувати і те, і інше.


7
Ви завжди можете статично пов’язати час виконання gcc та 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++.
тушканчик

Гм, ви кажете "... які не мають повної реалізації, коли GCC побудований із внутрішньою моделлю різьблення Win32 .... MinGW-w64 забезпечує" winpthreads "(реалізація pthreads поверх API багатогранності для Win32), який може GCC потім увійдіть, щоб увімкнути всі фантазійні функції. " Отже, якщо я виберу модель win32, GCC все одно може включити всі функції, оскільки вона використовує winpthreads? Але в кулі нижче ви пишете "win32: Немає багатопотокових функцій C ++ 11". Я не розумію. Чи означає ", до якого GCC може потім посилання на ..." означає, що якщо я не виберу win32, він може вибрати ...?
Йоханнес Шауб - ліб

@ JohannesSchaub-litb Ну, ні. Чарівна конфігурація GCC поєднує вибір моделі внутрішнього потоку з увімкненими функціями libstdc ++ завдяки тому, що останній будується поверх внутрішньої обертки Gthread GCC (що є лише тонкою абстракцією нитки, схожою на позикс. Основні елементи для функцій C ++ 11 відсутні у тому шарі, коли ви використовуєте --threads=win32. Отже, поки відсутні біти не реалізовані в GCC, ви повинні налаштувати GCC з --threads=win32.
rubenvb

Чи можу я використовувати попередньо складені бібліотеки mingw qt, які використовують -win32, з іншими бібліотеками, які використовують -posix, і використовувати обидві бібліотеки в одній програмі?
Йоханнес Шауб - ліб

16

Частини виконання GCC (зокрема, обробка виключень) залежать від використовуваної моделі різьблення. Отже, якщо ви використовуєте версію виконання, яка була побудована з потоками POSIX, але ви вирішили створити теми у власному коді за допомогою API Win32, швидше за все, у вас виникнуть проблеми.

Навіть якщо ви використовуєте версію для версії Win32 для виконання програми, ви, ймовірно, не повинні безпосередньо викликати API Win32. Цитуючи відповіді на поширені запитання про MinGW :

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


7
У цьому випадку, що робити з третіми сторонніми бібліотеками ниток, як boost або Qt? Чи є якийсь спосіб використовувати ці бібліотеки разом з mingw64, не розбираючи для них бібліотеку ниток? Що буде, якщо я довільно вирішувати використовувати boost :: теми з posix варіантом mingw?
tantuni

1
@ user460153 деяка інформація qt-project.org/wiki/…
Алекс В.

10
Ця відповідь неправильна. Час виконання GCC зовсім не впливає на API Win32.
rubenvb

Прочитайте пов'язаний запис із поширеними запитаннями. Ця відповідь правильна.
Дайра Хопвуд

13

Зауважте, що тепер можна використовувати деякі C ++ 11 std :: потоки в режимі нарізки win32. Ці адаптери, призначені лише для заголовка, розроблені для мене: https://github.com/meganz/mingw-std-threads

З історії ревізії схоже, що є нещодавня спроба зробити це частиною виконання mingw64.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.