Избегайте переключений контекста на критическом пути
???
CP: Параллелизм и одновременность
Часто мы хотим, чтобы наши компьютеры выполняли много задач одновременно (или по крайней мере казались их выполняющими). Причины этого варьируются (например, ожидание многих событий с использованием одного процессора, одновременная обработка многих потоков данных или использование многих аппаратных возможностей) и так же варьируются базовые возможности для выражения параллелизма и одновременности. Здесь мы формулируем принципы и правила для использования стандартных возможностей ISO C++ для выражения базовых параллелизма и одновременности.
Потоки — это машинный фундамент для параллельного и одновременного программирования. Потоки позволяют выполнять несколько разделов программы независимо, разделяя ту же память. Параллельное программирование сложно, потому что защита общих данных между потоками — легче сказать, чем сделать. Заставить существующий однопоточный код выполняться параллельно может быть так же просто, как стратегически добавить std::async или std::thread, или это может потребовать полную переработку, в зависимости от того, был ли исходный код написан таким образом, чтобы быть дружественным к потокам.
Правила параллелизма/одновременности в этом документе разработаны с тремя целями в виду:
среде
стандартной библиотекой
не дают необходимого увеличения производительности
- Помочь в написании кода, который может быть легко использован в потокированной
- Показать чистые, безопасные способы использования примитивов потокировки, предлагаемых
- Предоставить руководство по тому, что делать, когда параллелизм и одновременность
Также важно отметить, что параллелизм в C++ — это неполная история. C++11 представил много основных примитивов параллелизма, C++14 и C++17 улучшили их, и есть большой интерес к упрощению написания параллельных программ на C++. Мы ожидаем, что некоторые рекомендации, связанные с библиотекой здесь, значительно изменятся со временем.
Этот раздел нуждается в большой работе (очевидно). Обратите внимание, что мы начинаем с правил для относительных новичков. Остающихся экспертов нужно подождать; вклады приветствуются, но пожалуйста подумайте о большинстве программистов, которые борются за то, чтобы получить свои параллельные программы правильные и выполняющиеся эффективно.
Резюме правил параллелизма и одновременности:
- CP.1: Предположим, что ваш код будет выполняться как часть многопоточной программы
- CP.2: Избегайте гонок данных
- CP.3: Минимизируйте явное совместное использование изменяемых данных
- CP.4: Думайте в терминах задач, а не потоков
- CP.8: Не пытайтесь использовать
volatileдля синхронизации - CP.9: Когда это возможно, используйте инструменты для проверки вашего параллельного кода
См. также: