Чому я повинен віддавати перевагу тому чи іншому на практиці? Що таке технічні відмінності, крім того, що 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