Текущий правильный способ программирования потоков в Linux - PullRequest
4 голосов
/ 10 октября 2010

Я знаю, что реализация потоков в ядре Linux и libc претерпела большие изменения в прошлом. Каков наилучший способ использовать потоки из программ на C сегодня? (Я даже не знаю, можно ли использовать более одного API - я просто знаю pthreads)

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

Если я просто использую потоки Posix, как описано в man 7 pthreads, и ограничиваю свой код API POSIX, это будет нормально?

edit : спасибо всем, кто ответил. Я действительно думал об использовании некоторой доступной библиотеки пула потоков, но для этого проекта это действительно не вариант.

Ответы [ 3 ]

3 голосов
/ 10 октября 2010

По большей части, да.В этом суть POSIX.Каждая платформа, на которую вы планируете портировать (включая ОС, номер ядра и архитектуру), может иметь некоторые отличия, о которых вам нужно знать.Это ваша домашняя работа:)

Кроме того, как совет, фреймворки, такие как Qt, и пакеты библиотек, такие как Boost, делают большую часть этой работы более элегантной.Если вы можете интегрировать их, я настоятельно рекомендую это.

2 голосов
/ 10 октября 2010

POSIX темы - хороший выбор и популярный.Возможно, вы захотите взглянуть на Boost Threads и Intel Thread Building Blocks для других опций при программировании на C / C ++, а не на кодирование непосредственно в POSIX API.В частности, Intel TBB утверждает, что использует многоядерные процессоры простым и эффективным способом.У меня нет большого опыта работы с TBB, но я видел демонстрации, в которых использование TBB значительно уменьшало размер и сложность кода и выполнялось на порядок быстрее, чем реализация, написанная на простом C ++ с использованием потоков POSIX, написанных опытным инженером.1005 *

0 голосов
/ 10 октября 2010

Использование потоков сложно и подвержено ошибкам. Старайтесь не программировать их напрямую, если это возможно. Хорошо написанную статью на эту тему можно найти здесь .

Многоядерный параллелизм может быть достигнут различными способами, кроме прямого использования потоков. Самым простым является многопроцессность параллелизма. Для ядер n запустите процессы n и разделите рабочую нагрузку между ними. Это наиболее уместно, когда задачи крупнозернистые и практически не требуют связи между ними. Когда это должно быть в процессе, вы можете использовать передачу сообщений для всех коммуникаций и синхронизации между потоками и пытаться всегда передавать неизменяемые объекты как сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...