Чому я повинен віддавати перевагу тому чи іншому на практиці? Що таке технічні відмінності, крім того, що std::thread
це клас?
std::thread
і у них
std::thread
або pthreads
ні.
Чому я повинен віддавати перевагу тому чи іншому на практиці? Що таке технічні відмінності, крім того, що std::thread
це клас?
std::thread
і у них
std::thread
або pthreads
ні.
Відповіді:
Якщо ви хочете запустити код на багатьох платформах, перейдіть до Posix Threads. Вони доступні майже скрізь і досить зрілі. З іншого боку, якщо ви використовуєте лише Linux / gcc, std::thread
це прекрасно - він має більш високий рівень абстракції, дійсно хороший інтерфейс і чудово грає з іншими класами C ++ 11.
На std::thread
жаль, клас C ++ 11, на жаль, не працює надійно (поки що) на кожній платформі, навіть якщо C ++ 11 здається доступним. Наприклад, у рідних Android std::thread
або Win64 він просто не працює або має серйозні вузькі місця (станом на 2012 рік).
Хороша заміна є boost::thread
- вона дуже схожа на std::thread
(насправді це від того самого автора) і працює надійно, але, звичайно, вводить іншу залежність від сторонньої бібліотеки.
Редагувати: Станом на 2017 рік, std::thread
здебільшого працює на рідному Android. Деякі класи, як std::timed_mutex
і раніше, не реалізовані.
std::thread
і його стиль raii хороший тим, що він може обробляти винятки C ++, тоді як pthreads не може вийти з поля.
std::thread
Бібліотека реалізується на вершині Pthreads в навколишньому середовищі , підтримуючи Pthreads (наприклад: libstdc ++).
Я думаю, велика різниця між ними - абстракція. std::thread
є бібліотекою класів C ++. std::thread
Бібліотека включає в себе безліч абстрактних функцій, наприклад: контекстними замки, рекурсивні м'ютекси, майбутнє / обіцянку реалізації шаблон дизайну і багато іншого.
+1
від мене, щоб вказати на найважливіше, а саме те, що std :: thread забезпечує більш високий рівень абстракції.
std::thread
забезпечує портативність на різних платформах, таких як Windows, MacOS та Linux.
Як згадував @hirshhornsalz у коментарях нижче та відповіді на них https://stackoverflow.com/a/13135425/1158895 , std::thread
можливо, це ще не є повною на всіх платформах. Навіть все-таки (це буде найближчим часом) цьому слід віддавати перевагу pthread
, оскільки це повинно зробити вашу заявку більш надійною.
boost::thread
на Win64 або Bionic (Android), тому що std::thread
все ще бракує великих частин, де на Linux std::thread
здається досить зрілим.
Для мене вирішальною технічною відмінністю є відсутність примітивів обробки сигналу в std на відміну від pthreads. Неможливість належним чином продиктувати обробку сигналу в Unix-процесі, використовуючи лише std, це AFAIK - виснажливий недолік у використанні std :: thread, оскільки це перешкоджає встановленню добросовісної багатопотокової схеми обробки сигналів для обробки всіх сигналів у виділеній нитками і блокуйте їх у решті. Ви змушені вважати, що std :: thread реалізується за допомогою pthreads і сподіваєтесь на найкраще під час використання pthread_sigmask. Правильне поводження з сигналами не підлягає обороту в програмах систем Unix для підприємства.
Станом на 2016 рік, std :: thread - це іграшка; просто як це.
std::thread
приносить безпеку типу, якої не має pthread.
OpenMP
це стандартизований багатопотоковий стандарт на основі SMP, який працює в Linux і Windows вже більше десяти років. OpenMP доступний за замовчуванням у всіх компіляторах, включаючи GCC та Microsoft Visual Studio.
Одне, на що слід звернути увагу при використанні OpenMP, це те, що якщо є більше потоків, ніж ядер CPU, то продуктивність знизиться через перемикання контексту, пов’язаного з накладними витратами. Друге, що слід пам’ятати, це те, що ініціалізація фактичного рівня операційної системи, потік, є відносно дорогою. Ініціалізація - це частка секунди, але в деяких додатках дуже малі дроби накопичуються на значні витрати.
Щодо вимог архітектури програмного забезпечення, пов’язаних із одночасністю, можливо, вам доведеться шукати певну реалізацію "легких ниток" або "зелених ниток" замість використання OpenMP. Різниця полягає в тому, що потоки OpenMP є фактичними, рівень операційної системи, потоками, але "зелені нитки" можуть бути просто "імітованими нитками", які виконуються за допомогою деякої невеликої кількості реальних потоків.
std::async