好的,首先我必须在这个问题前加上免责声明,我对线程很陌生,所以这可能是一个“新手”问题,但我搜索了谷歌并找不到答案。据我了解,关键部分是可以由两个或多个线程访问的代码,一个线程的危险将在另一个线程完成之前覆盖一个值,反之亦然。您可以对课外所做的更改做些什么,例如,我有一个线路监控程序:
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。老实说,我也担心由于性能和死锁而锁定整个功能。