2014-10-10 1 views
0

Вот мой сценарий: мне нужно читать и писать на один и тот же последовательный порт в нескольких потоках. Вместо создания одного SerialPort в каждом потоке, который вызвал бы ошибку «access denied», я использую вид глобального кэша для выполнения задания. Для каждого последовательного порта я сохраняю только один объект 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, если поток, который пишет команду, также должен получить ответ. Это обычно так. Конечно, довольно значительная опасность параллелизма. –

+0

Почему в этом случае мне нужны Mutex? – Nico

ответ

0

«Безопасно ли иметь несколько потоков, вызывающих либо ReadByte, либо Способы записи одновременно?»

Да, это нормально, если только один поток читает и один поток пишет в любой момент времени.

Если у вас есть протокол поверх потокового байта, у вас могут возникнуть проблемы, но это не ясно из вашего вопроса.

+0

В моем сценарии нет ни одного потока для чтения и записи каждого, но для этого нужно сделать несколько потоков. Синхронизирован доступ к переменной SerialPort. – Nico

Смежные вопросы