c#lock可以序列化访问外部资源吗?

时间:2012-01-31 01:58:14

标签: c# serialization locking

我有一个多线程应用程序,它希望通过串口将一系列数据发送到外部设备。数据序列是典型的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版本。这是什么要求?

2 个答案:

答案 0 :(得分:1)

只要您锁定对指向外部资源的任何对象实例的所有访问权限,锁定就可以在您建议的情况下正常工作。

答案 1 :(得分:1)

是的,只要您的程序是访问串行端口的唯一软件,您的模式就是正确的。

您尚未发布整个代码。如果包含serialPortLock的类有多个实例,那么必须使serialPortLock成为静态。这通常是最佳做法。

class MySerialPort
{
   static object synchLock = new object();

   public void DoSomething()
   {
      lock (synchLock)
      {
        // whatever
      }
   }
}