我们在系统中使用物理(解(复用器(时分,一个输入,多个输出(。
路由一个通道时,会执行操作(例如,在路由的连接上执行某些操作(。在此操作期间,不允许任何其他人将多路复用器路由到另一个通道。
对于此方案,我们当前使用lock
语句,如
public void DoSomething(Action action, int channel)
{
lock(_lock)
{
_multiplexer.Route(channel);
action();
}
}
在此用例中使用lock
是否合适,或者是否有其他方法来处理锁定硬件设备?我经常读书
保持锁紧
和
从不在锁内执行任意操作
这些规则是否适用于这种情况?
是的,这是锁的适当用法(与其他锁定机制相反(。 但是,有些人可能会争辩说,应该使用另一个跨进程类型锁,如命名互斥锁,因为如果可以启动多个进程,它们可能会同时访问硬件,从而可能损坏数据。
"保持锁紧"通常意味着您应该确保在握住锁时不会进行任何不必要的处理。 例如,如果您需要分配一些空间来放置数据,这通常可以在锁外完成。 第二条规则通常是避免死锁。 例如,如果在传递给DoSomething
的操作中,代码将锁定不同的锁,并且在某些情况下,其他代码将在调用DoSomething
之前访问该锁,如果这两个代码路径碰巧同时运行,您将有死锁(一个将持有此锁并等待另一个, 另一个会握住另一把锁并等待这把锁(。 如果使用此代码的开发人员有纪律,在指定的操作中永远不会采取任何锁定或进行任何不必要的处理,那么事情会正常工作,但这是一个很大的如果。
如果可能的话,对通道上可以完成的所有可能操作进行编码会更安全(更好(,这样所有锁都隐藏在实现中,并且在持有锁时不会调用外部代码。 这样,不了解内部结构的人就不可能编写导致死锁的代码。