【问题标题】:Do i need to synchronize read and write actions to the same SerialPort instance?我是否需要将读取和写入操作同步到同一个 SerialPort 实例?
【发布时间】:2014-10-10 13:35:21
【问题描述】:

这是我的场景:我需要在多个线程中读取和写入同一个串行端口。我没有在每个线程中创建一个 SerialPort,这会导致“拒绝访问”错误,而是使用一种全局缓存来完成这项工作。对于每个串口,我只保留一个 SerialPort 对象。

private static object locker = new object();
internal static Dictionary<int, SerialPort> SerialPorts = new Dictionary<int, SerialPort>();

private SerialPort GetSerialPort(string port)
    {
        lock (locker)
        {
            if (!SerialPorts.ContainsKey(port))
            {
                SerialPort sp = new SerialPort(port, baudrate);

                sp.Open();

                SerialPorts[key] = sp;
            }
        }

        return SerialPorts[key];
    }

在读写操作中,我首先调用 GetSerialPort 来获取 SerialPort 对象。然后调用各自的 ReadByte 和 Write 方法。现在我的问题是:没有任何特殊处理,只让多个线程同时调用 ReadByte 或 Write 方法是否安全?

【问题讨论】:

  • 如果编写命令的线程也需要获得响应,那么您将需要一个 Mutex。通常情况就是这样。当然是相当严重的并发风险。
  • 为什么在这种情况下我需要 Mutex?

标签: multithreading serial-port


【解决方案1】:

'只有多个线程调用 ReadByte 或 同时写方法?'

是的,没关系,只要在任何时候只有一个线程读取和一个线程写入。

如果您在串行字节流之上有任何协议,您可能会遇到问题,但这在您的问题中并不清楚。

【讨论】:

  • 我的方案不是每个线程都有一个读写线程,而是有多个线程执行此操作。只是对 SerialPort 变量的访问是同步的。
猜你喜欢
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
相关资源
最近更新 更多