如何获取阻塞线程计数器尝试在 C# 中输入锁定部分

本文关键字:锁定部 输入 计数器 线程 何获取 获取 | 更新日期: 2023-09-27 18:32:29

我需要知道有多少线程试图进入关键部分。我有一个设备的集合,我想获取具有最少数量的待处理线程的设备。

List<Device> devices;
.
.
.
Device device = Device.getAvailableDevice( devices );
lock (device)
{
     device.DoSomeWork();
}

我知道我可以使用一些计数器,但我试图避免它。提前谢谢。

如何获取阻塞线程计数器尝试在 C# 中输入锁定部分

你的逻辑有一个根本性的缺陷。

我假设您打算Device.getAvailableDevice( devices )该方法返回实际可用的设备 - 甚至是第一个可用的设备。但是您仅在该呼叫后锁定设备。这意味着多个线程可能会观察到设备可用,然后尝试锁定它。因此,线程确实在队列中等待获取设备,该设备应该是"可用"的。因此,您问如何找出有多少人在等待,因为您希望该信息Device.getAvailableDevice( devices )实施,如果不找到没有人在等待的信息,那么至少要找到即将可用的那个。

相反,您应该做的是创建某种设备管理器,其中包含两个集合:可用设备和正在使用的设备。管理器应有两种方法:GetAvailableDevice返回可用设备并将其设置为正在使用中,ReturnDevice使设备再次可用(即将其从正在使用的设备集合移动到可用设备集合(。

这两种方法锁定在设备管理器上,但不锁定在单个设备上。GetAvailableDevice调用阻塞,线程可能正在等待管理器返回一个。ReturnDevice调用不会阻塞,因为它会立即返回。

有关如何实现这种结构的更多信息,我建议您阅读Joseph Albahari的"C#线程",请参阅 http://www.albahari.com/threading/。

基于每个设备的队列的解决方案需要立即决定哪个设备将来会繁忙或可用。当它做出决定时,发生的第一件事是请求它的线程开始等待该特定设备(可能为零时间段(。

基于所有设备组合的单个队列的解决方案不需要预测未来。当设备变得可用时,任何设备都会将其提供给可以立即开始使用它的等待线程。线程等待设备管理器为其提供设备(可能为零时间段(,但不等待提供给它们的设备。此解决方案还避免了线程仍在等待设备,而另一个设备已经可用,没有线程等待它的情况。

据我所知,除了使用计数器之外别无他法。在锁定之前递增它,在锁定块之后减少它。