C ++ 11 std :: потоки проти ниток posix


157

Чому я повинен віддавати перевагу тому чи іншому на практиці? Що таке технічні відмінності, крім того, що std::threadце клас?


5
На практиці вам слід скористатисяstd::async
Стефан Доллберг

@bamboon Це страждає від тих же проблем, що std::threadі у них
Гюнтер П'єз

2
@hirschhornsalz з точки зору підтримки компілятора, так. з технічної точки зору, це забезпечує безпеку винятків, яка є, std::threadабо pthreadsні.
Стефан Доллберг

15
Проголосували за повторне відкриття. Запит на "технічні відмінності" робить це об'єктивно відповідальним. Високий підрахунок голосів свідчить про те, що інші вважають цю публікацію конструктивною та корисною.
Адріан Маккарті

Відповіді:


121

Якщо ви хочете запустити код на багатьох платформах, перейдіть до 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і раніше, не реалізовані.


19
Чи є у вас які-небудь докази, що підтверджують ці вимоги до «ефективного вузького місця»? Крім того, std::threadі його стиль raii хороший тим, що він може обробляти винятки C ++, тоді як pthreads не може вийти з поля.
Джессі Добрий

9
Тепер у 2014 році ця відповідь все ще діє?
безглуздість

25
А як щодо тепер, початку 2017 року?
rmobis

9
Що ж тепер, у 2017 році середній?
Гонки легкості по орбіті

14
А як щодо тепер, у 2018 році середнього?
陳 力

59

std::threadБібліотека реалізується на вершині Pthreads в навколишньому середовищі , підтримуючи Pthreads (наприклад: libstdc ++).

Я думаю, велика різниця між ними - абстракція. std::threadє бібліотекою класів C ++. std::threadБібліотека включає в себе безліч абстрактних функцій, наприклад: контекстними замки, рекурсивні м'ютекси, майбутнє / обіцянку реалізації шаблон дизайну і багато іншого.


4
+1від мене, щоб вказати на найважливіше, а саме те, що std :: thread забезпечує більш високий рівень абстракції.
sbi

33

std::thread забезпечує портативність на різних платформах, таких як Windows, MacOS та Linux.

Як згадував @hirshhornsalz у коментарях нижче та відповіді на них https://stackoverflow.com/a/13135425/1158895 , std::threadможливо, це ще не є повною на всіх платформах. Навіть все-таки (це буде найближчим часом) цьому слід віддавати перевагу pthread, оскільки це повинно зробити вашу заявку більш надійною.


2
насправді std :: потоки забезпечують портативність на всіх платформах, що підтримують C ++ 11, тоді як потоки POSIX доступні лише на платформах POSIX (або платформах, які прагнуть до мінімальної сумісності).
Тобіас Лангнер

1
З практичної ПОВ це просто неправильно. Я насправді кілька місяців тому зважився на це міркування - це була велика помилка. На практиці вам доводиться використовувати boost::threadна Win64 або Bionic (Android), тому що std::threadвсе ще бракує великих частин, де на Linux std::threadздається досить зрілим.
Гюнтер П'єз

1
@hirschhornsalz, суть моєї відповіді полягає в тому, щоб вказати на користь переносимості, яку забезпечує реалізація потоку c ++ 11 порівняно з pthread. ОП не питав про підвищення, але його портативний також.
Брейді

3
@hirschhornsalz, що стосується Вашого негативного тону та звинувачення в тому, що ніколи не використовуйте теми, вони просто несемобільні і не заслуговують великих зусиль з мого боку. Я думаю, що принаймні варто згадати, що більш конструктивним коментарем було б вказати на проблеми, які ви намагалися використовувати std :: thread на різних платформах.
Брейді

3
Підводячи підсумок, c ++ 11 std :: thread може використовуватися лише в останніх версіях GCC. Він майже не завершений у Visual Studio, тому не використовується в Windows. І звичайно, його абсолютно не вистачає в комерційних компіляторах на UNIXes (Sun Studio на Solaris, HP ACC на HP-UX, IBM vacpp на AIX). Тому, якщо ваша цільова платформа лише Linux - c ++ 11 std :: thread чудово; якщо вам також потрібен Windows або інший UNIX - це шлях.
vond

7

Для мене вирішальною технічною відмінністю є відсутність примітивів обробки сигналу в std на відміну від pthreads. Неможливість належним чином продиктувати обробку сигналу в Unix-процесі, використовуючи лише std, це AFAIK - виснажливий недолік у використанні std :: thread, оскільки це перешкоджає встановленню добросовісної багатопотокової схеми обробки сигналів для обробки всіх сигналів у виділеній нитками і блокуйте їх у решті. Ви змушені вважати, що std :: thread реалізується за допомогою pthreads і сподіваєтесь на найкраще під час використання pthread_sigmask. Правильне поводження з сигналами не підлягає обороту в програмах систем Unix для підприємства.

Станом на 2016 рік, std :: thread - це іграшка; просто як це.


7
Я не погоджуюсь. А велике використання сигналів - це модель дизайну, яку можна уникнути для більшості застосувань.
Ерік Алапяа

Також std::threadприносить безпеку типу, якої не має pthread.
alfC

-3

OpenMP

http://www.openmp.org/

це стандартизований багатопотоковий стандарт на основі SMP, який працює в Linux і Windows вже більше десяти років. OpenMP доступний за замовчуванням у всіх компіляторах, включаючи GCC та Microsoft Visual Studio.

Одне, на що слід звернути увагу при використанні OpenMP, це те, що якщо є більше потоків, ніж ядер CPU, то продуктивність знизиться через перемикання контексту, пов’язаного з накладними витратами. Друге, що слід пам’ятати, це те, що ініціалізація фактичного рівня операційної системи, потік, є відносно дорогою. Ініціалізація - це частка секунди, але в деяких додатках дуже малі дроби накопичуються на значні витрати.

Щодо вимог архітектури програмного забезпечення, пов’язаних із одночасністю, можливо, вам доведеться шукати певну реалізацію "легких ниток" або "зелених ниток" замість використання OpenMP. Різниця полягає в тому, що потоки OpenMP є фактичними, рівень операційної системи, потоками, але "зелені нитки" можуть бути просто "імітованими нитками", які виконуються за допомогою деякої невеликої кількості реальних потоків.


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