我有一个多线程应用程序,它希望通过串口将一系列数据发送到外部设备。数据序列是典型的cmd - 响应协议(即:给定的线程发送一个字节序列,然后等待读取响应,通常是一个ack然后它可能发送另一个序列)。
我们要做的是声明一段代码对该资源具有独占访问权限,直到完成为止,如果另一个线程想要访问相同的外部资源,它就会等待。
这看起来像LOCK的作用,但我见过的所有示例都显示锁用于保护特定的代码块,而不是序列化对资源的访问。
所以以编程方式可以
Object serialPortLock = new Object();
并且在我的程序的不同部分使用一个看起来像:
的构造Lock (serialPortLock)
{
// my turn to do something that is not the same as what
// someone else wants to do but it acts on the same resource
}
c#文档讨论了如何使用Mutex作为更强大的Lock版本。这是什么要求?
答案 0 :(得分:1)
只要您锁定对指向外部资源的任何对象实例的所有访问权限,锁定就可以在您建议的情况下正常工作。
答案 1 :(得分:1)
是的,只要您的程序是访问串行端口的唯一软件,您的模式就是正确的。
您尚未发布整个代码。如果包含serialPortLock的类有多个实例,那么必须使serialPortLock成为静态。这通常是最佳做法。
class MySerialPort
{
static object synchLock = new object();
public void DoSomething()
{
lock (synchLock)
{
// whatever
}
}
}