Большая проблема заключается в том, что в целом при разработке приложения очень сложно выбрать один поток, а затем добавить многопоточность. Выбор имеет основополагающее значение для дизайна идиомы, к которым вы будете стремиться. Вот краткое, но плохое руководство по некоторым вещам, на которые вы должны обращать внимание, и по тому, как изменить свой код (обратите внимание, что ни один из них не сделан в камне, всегда есть обходной путь):
- Удалить все изменяемые глобальные переменные. Я бы сказал, что это относится и к однопоточным приложениям, но это только я.
- Добавьте "const" к как можно большему количеству переменных в качестве первого прохода, чтобы решить, где происходят изменения состояния, и делать записи об ошибках компиляции. Это не значит «превратить все ваши переменные в const». Просто разобраться, где будут ваши проблемные области, просто взломать.
- Для тех элементов, которые являются изменяемыми и которые будут использоваться совместно (то есть вы не можете оставлять их как const без предупреждений компиляции), установите вокруг них блокировки. Каждый замок должен быть зарегистрирован.
- Далее представьте свои темы. Вероятно, вы будете страдать от множества взаимоблокировок, блокировок, условий гонки и других проблем, поскольку ваше однопоточное приложение делало предположения о порядке и порядке выполнения вашего приложения.
- Начните с удаления ненужных блокировок. То есть посмотрите на изменяемое состояние, которое не используется в ваших потоках. Эти замки излишни и должны быть отправлены.
- Далее изучите ваш код. На данный момент, определение того, где находятся ваши проблемы, - это больше искусство, чем наука. Хотя есть достойные руководители о том, как это сделать, это все, что я могу сказать.
Если это звучит как слишком большое усилие, пришло время взглянуть на модель актера для параллелизма. Это было бы похоже на создание нескольких разных приложений, которые вызывают друг друга по схеме передачи сообщений. Я считаю, что актеры не только интуитивно понятны, но и чрезвычайно дружелюбны, чтобы определить, где и как вы можете столкнуться с проблемами многопоточности. При настройке Актеров почти невозможно не думать обо всех «что, если».
Лично, когда я имею дело с однопоточным многопоточным преобразованием, я делаю как можно меньше для достижения целей проекта. Это просто безопаснее.