2014-10-10 53 views
0

這是我的場景:我需要從多個線程中讀取和寫入相同的串行端口。不是在每個線程中創建一個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方法是安全的?

+0

如果寫入命令的線程也需要獲取響應,您將需要一個Mutex。通常情況是這樣。當然是一個非常重要的併發風險。 – 2014-10-10 17:29:53

+0

爲什麼在這種情況下我需要互斥鎖? – Nico 2014-10-11 00:44:19

回答

0

'是否可以安全地調用ReadByte或 多個線程同時寫入方法?

是的,這很好,只要一次線程讀取,一次線程寫入,就可以。

如果你在串行字節流的頂部有任何協議,你可能會遇到問題,但是這個問題並不清楚。

+0

我的場景是不用一個線程來讀取和寫入每個線程,而是讓多個線程執行此操作。這只是對SerialPort變量的訪問是同步的。 – Nico 2014-10-11 00:45:29

相關問題