Начнем в обратном порядке:
Как можно реализовать многопоточность в библиотеке?
Это не так, по крайней мере, не в (чистом) С++. Для этого требуется поддержка языка (компилятор — это только реализация).
На данный момент используются 2 вещи:
- ассемблерный код для некоторых деталей (как в библиотеке
pthread
)
- специальные инструкции компилятора для других (в зависимости от компилятора и платформы)
Оба хрупкие и требуют огромного количества работы для переносимости. По сути, это означает множество #ifdef
частей кода для проверки компилятора и целевой архитектуры, проверки поддержки некоторых директив и т. д.
Вот почему было сочтено необходимым добавить поддержку многопоточности в C++0x.
Как сделать многопоточность?
Еще до того, как вы выберете библиотеку, вы должны выбрать метод. Существует 2 способа программирования многопоточных приложений (и их можно комбинировать):
- Общайтесь путем обмена: это означает использование мьютексов, атомарных операций и т. д. Вы можете использовать
pthread
на платформах Linux, но я бы рекомендовал Boost.Thread
(среди прочего) из-за его переносимости.
- Обменивайтесь, общаясь: более поздний вариант, адаптированный для распределенных вычислений, связанный с функциональными языками. Это означает передачу сообщений из одного потока в другой без совместного использования каких-либо ресурсов. Вы можете использовать FastFlow или Intel Основные блоки потока, также известные как
TBB
.
Вы можете объединить их, но лучше этого не делать. Лично я нашел описание FastFlow совершенно потрясающим: оно поощряет программирование без блокировок. Кроме того, основное преимущество второго метода заключается в том, что он лучше приспособлен к многопроцессорному программированию и масштабируется для распределенных сред.
Для начала я бы порекомендовал сосредоточиться на одном из них и создать с его помощью несколько приложений. Когда вам будет комфортно, вы можете попробовать другой, но будьте готовы начать заново, настолько они разные.
person
Matthieu M.
schedule
26.06.2010