C#实现多路复用器的硬件锁

Realize hardware lock for multiplexer in C#

我们在我们的系统中使用物理(解)多路复用器(时分,一个输入,多个输出)。

当一个通道被路由时,一个动作被执行(例如在路由连接上做某事)。在此操作期间,不允许其他人将多路复用器路由到另一个通道。

对于这种情况,我们目前使用 lock 语句,如

public void DoSomething(Action action, int channel)
{
    lock(_lock)
    {
        _multiplexer.Route(channel);
        action();
    }
}

在此用例中使用 lock 是否合适,或者是否有其他方法来处理锁定硬件设备?我经常阅读

Keep locks tight

Never execute arbitrary actions within a lock

这些规则适用于这种情况吗?

是的,这是对锁的恰当使用(相对于其他锁定机制)。然而,有些人可能会争辩说应该使用另一种跨进程类型的锁,如命名互斥锁,因为如果可以启动多个进程,它们可能同时访问硬件,可能会破坏数据。

"Keep locks tight"一般的意思是你应该确保在持有锁的时候不做任何不必要的处理。比如需要分配一些space来放数据,一般可以在锁外完成。第二条规则通常是为了避免死锁。例如,如果在传递到 DoSomething 的操作中,代码将锁定一个 不同的 锁,并且在某些情况下,其他代码将在调用 [=10] 之前访问该锁=],如果这两个代码路径同时发生在 运行 上,就会发生死锁(一个持有这个锁并等待另一个,另一个持有另一个锁并等待这个一)。如果使用此代码的开发人员有纪律,从不在指定的操作中获取任何锁或进行任何不必要的处理,那么一切都会正常进行,但这是一个很大的假设。

如果可能的话,以一种所有锁都隐藏在实现中并且不调用外部代码的方式编写可以在通道上完成的所有可能操作的代码会更安全(更好)持有锁时进行。这样,不了解内部结构的人就不可能编写导致死锁的代码。