如何在等待列表中脉冲最后一个线程?

时间:2012-12-06 06:37:37

标签: c# locking

我正在尝试同时访问某些资源,因此我正在使用lock

object lockObject = new object();
lock(lockObject)
{
    //Acquire some resources and do some operations  
}
//Pulse only the most recently joined thread in waiting list

但我想要的只是脉冲最后一个线程(最近在等待列表中加入线程)并忽略其他线程(死锁,中止或饥饿不是这里的关注点)。 我能想到的一个选择是使用消息队列并忽略除最后一个消息之外的所有消息。除此之外,我怎么能简单地脉冲最后一个线程并忽略其他线程?

1 个答案:

答案 0 :(得分:1)

有很多方法可以实现这一点。这是一种方式。

你将拥有一个'线程管理器',每个线程都会调用它来“等待”资源。

此线程管理器基本上将管理Stack WaitHandles。 当一个线程调用管理器时,它将创建一个新的WaitHandle,并将其推送到堆栈,然后将该实例提供给它可以等待的线程。

当你的代码想要让最后一个等待线程到pulse时,它会从堆栈中弹出最顶层的等待句柄,并signal它。

(注意,这种架构依赖于调用线程在WaitHandle上等待。)

HTH