Хорошо, сначала я должен предвосхитить этот вопрос с заявлением об ограничении ответственности, я действительно новичок в потоках, так что это может быть вопрос новичка, но я искал в Google и не смог найти ответ.Насколько я понимаю, критический раздел - это код, к которому могут обращаться два или более потоков, опасность состоит в том, что один поток перезапишет значение до завершения другого, и наоборот.Что вы можете сделать, например, с изменениями, внесенными за пределы вашего класса, у меня есть программа мониторинга линии:
int currentNumber = provider.GetCurrentNumber();
if(provider.CanPassNumber(false, currentNumber))
{
currentNumber++;
provider.SetNumber(currentNumber);
}
, а в другом потоке у меня что-то вроде этого:
if(condition)
provider.SetNumber(numberToSet);
СейчасЯ боюсь, что в первой функции я получаю currentNumber, который равен 5, сразу после этого в другом потоке число устанавливается равным 7, а затем оно перезаписывает 7 на 6, игнорируя изменения, сделанные потоком, который установил его в 7.
Есть ли какой-либо способ заблокировать provider.SetNumber до завершения первой функции?Критическим разделом является в основном currentNumber, который может быть изменен многими местами в программе.
Надеюсь, я дал понять, если не скажу, и постараюсь объяснить себя лучше.
РЕДАКТИРОВАТЬ: Также я сделал функции очень короткими для примера.На самом деле функция намного длиннее и многократно вносит изменения в currentNumber, поэтому я не хочу блокировать всю функцию.Если я блокирую все вызовы provider.SetNumber и освобождаю его после завершения, он может измениться во время его освобождения, прежде чем я снова заблокирую его для вызова provider.SetNumber.Честно говоря, я также беспокоюсь о блокировке всей функции из-за производительности и тупика.