我目前正在使用 C# 开发一个项目。我正在使用单个锁同步对状态变量的访问。此状态变量被触发以设置给定时间段,然后应重置其值。我当前的代码如下。
using System.Threading;
class Test
{
object syncObj = new object();
bool state = false;
Timer stateTimer;
Test()
{
stateTimer = new Timer(ResetState, this, Timeout.Infinite, Timeout.Infinite);
}
void SetState()
{
lock(syncObj)
{
state = true;
stateTimer.Change(1000, Timeout.Infinite);
}
}
static void ResetState(object o)
{
Test t = o as Test;
lock(t.syncObj)
{
t.state = false;
}
}
}
鉴于在 Timer 调用 ResetState 之前再次调用 SetState 是有效的(即允许延长状态为 true 的时间段),我可以想象单个锁可能不够用的情况。我正在考虑的具体情况是这样的
- SetState 和 ResetState 都是同时进入的,分别在主线程和 Timer 线程上
- SetState先获取锁,正确设置state为true,触发定时器重新启动
- 然后 ResetState 错误地将 state 设置为 false,这意味着在预期的时间段内 state 不是 true
我一直在为这个问题挠头一段时间。我最接近能够解决的方法是使用两个锁,但最后我发现这导致了其他问题(至少,我这样做的方式)。
有没有已知的方法来解决这个问题(我应该阅读一些东西来刷新我的同步知识)?
更新:我忘了提到在这种情况下无法查询计时器的当前状态。如果可以的话,我会想象检查 ResetState 中的剩余时间以确定计时器是否真的停止了。