Существуют ли альтернативы pthreads для linux для параллельного выполнения и совместного использования памяти? - PullRequest
0 голосов
/ 06 марта 2020

Я написал приложение на c ++ linux, в котором использовалась библиотека pthread. Но у меня это не сработало, потому что вместо запуска 100 потоков было запущено только 98 потоков: pthread_join Ошибка сегментации с 100 потоками Есть ли альтернатива, кроме 'fork', для распараллеливания моего кода? Преимущество потоков заключалось в том, что у меня была общая глобальная переменная, и я мог разместить мьютекс там, где мне нужно было написать общую переменную.

1 Ответ

1 голос
/ 07 марта 2020

Есть ли альтернатива, отличная от 'fork', для распараллеливания моего кода?

Существует std::thread, который люди C ++ здесь в любом случае склонны советовать людям использовать вместо pthreads , Однако весьма вероятно, что это будет реализовано поверх потоковой библиотеки более низкого уровня, скорее всего, pthreads в системе, которая предлагает pthreads.

Существует также OpenMP, но это снова оболочка вокруг механизмов потоков нижнего уровня.

Единственная легкодоступная альтернатива распараллеливанию через несколько потоков - это распараллеливание через несколько процессов, что я и имею в виду, ссылаясь на fork.

Преимущество потоков заключалось в том, что у меня была общая глобальная переменная, и я мог разместить мьютекс там, где мне нужно было написать общую переменную.

Возможно разделить память между несколько процессов и иметь взаимные исключения, которые являются общими для процессов. Это немного сложнее, чем просто использовать обычную переменную общего доступа, но не настолько. Механизмы для этого называются «разделяемой памятью», и в мире POSIX есть два варианта: более старые, так называемые сегменты разделяемой памяти System V. и более новая разделяемая память POSIX.

Могу, однако, предложить что лучшим решением может быть просто уменьшить количество потоков. 100 потоков чрезвычайно много для параллельных вычислений на большинстве машин, потому что ваш истинный параллелизм ограничен числом исполнительных блоков (ядер), которые есть у машины. Больше потоков может иметь смысл, если вы ожидаете, что они будут регулярно блокировать ввод-вывод (в разных файлах) в течение значительного времени, но даже тогда 100, вероятно, выходит за пределы разумного. Если у вас есть больше потоков, борющихся за время выполнения, чем у вас есть исполнительные блоки для планирования их, то вы, вероятно, получаете худшую производительность, чем с меньшим количеством потоков.

...