Я бы обобщил, что написание высокооптимизированного многопоточного процесса намного сложнее, чем просто создание нескольких потоков в миксе.
Я рекомендую начать со следующих шагов:
- Разделите ваши рабочие нагрузки на отдельные параллельные исполняемые модули
- Измерение и характеристика типов рабочих нагрузок - интенсивная работа в сети, интенсивная работа ввода-вывода, загрузка ЦП и т. Д. - они становятся основой для ваших стратегий объединения рабочих. например у вас могут быть довольно большие пулы рабочих для приложений, интенсивно использующих сеть, но не имеет смысла иметь больше работников, чем аппаратных потоков для задач, интенсивно использующих процессор.
- Подумайте об организации очереди / массива или ThreadWorkerPool для управления пулами потоков. Бывший более мелкозернистый, чем последний.
- Научитесь предпочитать шаблоны асинхронного ввода-вывода по сравнению с шаблонами синхронизации, если можете - освобождает больше процессорного времени для выполнения других задач.
- Работа по устранению или, по крайней мере, сокращению сериализации вокруг конфликтующих ресурсов, таких как диск.
- Минимизируйте ввод / вывод, приобретайте и удерживайте минимальный уровень блокировок в течение минимально возможного периода. (Блокировка чтения / записи - ваш друг)
5. Просмотрите этот код, чтобы убедиться, что ресурсы заблокированы в последовательной последовательности, чтобы минимизировать смертельные объятия.
- Тестируйте как сумасшедшие - условия гонки и ошибки в многопоточных приложениях - адский способ устранения неполадок - часто вы видите только судебные следствия резни.
Помните, что вполне возможно, что многопоточная версия может работать хуже, чем однопоточная версия того же приложения. Нет оправдания для хороших инженерных измерений.