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



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

路由一个通道时,会执行操作(例如,在路由的连接上执行某些操作(。在此操作期间,不允许任何其他人将多路复用器路由到另一个通道。

对于此方案,我们当前使用lock语句,如

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

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

保持锁紧

从不在锁内执行任意操作

这些规则是否适用于这种情况?

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

"保持锁紧"通常意味着您应该确保在握住锁时不会进行任何不必要的处理。 例如,如果您需要分配一些空间来放置数据,这通常可以在锁外完成。 第二条规则通常是避免死锁。 例如,如果在传递给DoSomething的操作中,代码将锁定不同的锁,并且在某些情况下,其他代码将在调用DoSomething之前访问该锁,如果这两个代码路径碰巧同时运行,您将有死锁(一个将持有此锁并等待另一个, 另一个会握住另一把锁并等待这把锁(。 如果使用此代码的开发人员有纪律,在指定的操作中永远不会采取任何锁定或进行任何不必要的处理,那么事情会正常工作,但这是一个很大的如果。

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

最新更新