Ну, это может звучать неправильно, но правда в том, что вы не можете доказать многопоточность с помощью юнит-тестов. Сказав это, вы можете получить некоторую уверенность в коде с тестированием, и со временем это может фактически стать проблемой.
Многопоточный код - проклятие моего существования во многих проектах. Часто люди / разработчики не имеют опыта, необходимого для хорошей работы. Ошибки часто остаются незамеченными в течение длительных периодов времени, прежде чем кто-либо увидит их в дикой природе, и тогда вы не сможете воспроизвести проблему, чтобы определить, что происходит. Кроме того, попытка «исправить» неисправный многопоточный код с помощью отладки часто не является жизнеспособным подходом.
Во всяком случае, продолжайте и проверьте это, нет ничего плохого в том, чтобы делать так много, и это достаточно легко сделать. Просто запустите N потоков, пусть они все ждут на ManualRestEvent, а затем вызовите свой API в тесной петле пару сотен тысяч раз :). Но сначала я бы порекомендовал всем членам вашей команды выполнить проверку кода. Пройдите каждую строку кода, думая о его параллельном выполнении. Задайте себе вопрос:
- Мне действительно нужен этот замок ()?
- Какой наименьший объем кода ДОЛЖЕН быть в блокировке ()?
- Могу ли я сделать этот объект / состояние неизменным и избежать блокировки?
- Есть ли способ для вызывающей стороны, чтобы код выполнялся внутри блокировки?
- Просмотр всех членов, к которым обращались и которые меняли внутри замка на «volatile»?
- Правильно ли вы используете System.Threading.Thread.MemoryBarrier?
- Если задействованы несколько блокировок, всегда ли они получаются в одном и том же порядке?
- [вики добавить сюда]