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