Еще один стартово - (в)водный мануальчик.
Первое - на вопрос "а давайте поговорим о многопоточности" хорошим ответом будет встречный вопрос: "Вы имеете ввиду concurrency или parallelism?". Разница проста - второе про организацию работы таким образом, чтобы разные задачи выполнялись разными ядрами (или даже клиентами), а первое - про преодоление проблем, которые могут возникнуть из-за синхронизации совместной работы разных ядер/клиентов.
Если более снаружи:
- параллелизм - это про дизайн, а concurrency - про детали реализации.
- параллелизм - это то, что мы хотим получить, а concurrency- то, от чего хотим по возможности избавиться.
Общий подход к дизайну параллелизма - смотрим на таблицу ниже, смотрим, какими сущностями мы можем обойтись на стадии дизайна, по возможности минимизируем, инкапсулируем и сводим к примитивам сущности из 4 и 5 строк.
Редактируется | Читается | Оценка | Проблемы |
---|---|---|---|
константный | только создателем | 0.2 | от злоупотребления неизменяемыми данными можно поймать оверхед по памяти или её излишнюю фрагментацию |
константный | несколькими потоками | 0.1 | как бы всё не было надёжно, чем меньше межпоточного взаимодействия - тем лучше |
только создателем | только создателем | 0 | Достоинства-максимум степеней свободы |
только создателем | несколькими потоками | 1 | Возможно неконсистентное чтение |
несколькими потоками | несколькими потоками | 100 | огромное количество возможных проблем |
(дополнение - если производительность менее важна, чем надёжность и ошибкоустойчивость кода, поменяйте оценки первой и третьей строки).
(продолжение следует)