所以我知道你可以使用一个信号量和其他可能的方法来确定一个锁是否会成功和/或有多少个线程在等待锁,但是你可以在锁定自己?如何测试锁内等待线程
我的情况是我有一个事件处理程序,可以由List
中的许多对象调用。我想在一个锁内做一个测试,看看在继续之前所有的对象是否处于正确的状态。对象过渡到适当的状态然后引发此事件,因此在单个线程模型中,当最后一个引发此事件时,所有对象都处于正确状态,我们继续。但是在我看来,使用多线程时,多个对象可能会转换到我正在检查的状态,但尚未处理此事件,因为它们正在等待锁定。因此,锁内的条件状态检查将是真实的,但是直到所有线程完成处理该事件为止都将继续执行。我只需要它是真实的,因为最后一个线程被处理,以确保我们不会太快。
例如,在半写实代码:
object _LockObj = new object();
void Event_Handler(object sender, EventArgs e)
{
MyObject originator = sender as MyObject;
if(originator == null)
return;
*Do stuff with the originator*
lock(_LockObj)
{
if(ListOfMyObjects.FindAll(o => o.State == DesiredState)
.Count == ListOfMyObjects.Count
&& *nothing waiting at the lock*)
{
*Proceed*
}
}
}
我完全愿意接受我的做法是臭下手,并且我正在寻找解决的办法是没有实际意义,如果我在做正确首先,但我不确定如何以线程安全的方式正确执行此操作。
我打算给MyObject
添加更多状态,并通过在*Do stuff with the originator*
部分设置相应的状态来管理流程,但是从这里转换MyObject并不合适,更不用说我必须实现一个为每个引发异味变得不简单的事件状态持有状态!
因此,如果有做“没有设定锁定等待”检查那么这就是我想去除非我失去了一个非常简单的实现模式,有助于在这种情况下的方式的简单方法。
您正在寻求一个线程比赛错误作为功能。在你断定没有线程正在等待之后的一个纳秒内,一个线程可以进入该方法。 –