Я только что написал метод, который вызывается несколькими потоками одновременно, и мне нужно отслеживать, когда все потоки завершены. Код использует этот шаблон:
private void RunReport()
{
_reportsRunning++;
try
{
//code to run the report
}
finally
{
_reportsRunning--;
}
}
Это единственное место в коде, значение _reportsRunning
изменено, и для этого метода требуется около секунды.
Иногда, когда у меня более шести или около того потоков, работающих вместе, итоговый результат для _reportsRunning может спуститься до -1. Если я переношу вызовы на _runningReports++
и _runningReports--
в блокировку, то поведение кажется правильным и последовательным.
Итак, на вопрос: когда я изучал многопоточность на С++, мне учили, что вам не нужно синхронизировать вызовы для операций увеличения и уменьшения, потому что они всегда были одной инструкцией по сборке, и поэтому было невозможно, чтобы поток был выключенный средний вызов. Правильно ли я преподавал, и если да, то почему это не верно для С#?