как переключаться между потоками при блокировке порта? - PullRequest
1 голос
/ 29 июля 2010
static SerialPort port = new SerialPort("COM3", 57600, Parity.None, 8, StopBits.One);
thread1()
{

   lock(port)
   for(;;)
      port.write"Hi 1";
}
thread2()
{
   lock(port)
   for(;;)
      port.write"Hi 2"
}

выход: (в Hyper-Terminal)

Hi 1
Hi 1
Hi 1

здесь, поскольку поток1 заблокирован и находится в бесконечном цикле, так что он вообще не выходит из потока1 ... но мне нужны потоки1 и поток2 для одновременной печати. ​​Пожалуйста, помогите мне.

Спасибо.

1 Ответ

2 голосов
/ 29 июля 2010

Ну, они не могут печатать одновременно , если они используют один и тот же порт ... но вы могли бы иметь в виду это:

void Thread1()
{    
   for(;;)
   {
      lock (port)
      {
          port.Write("Hi 1");
      }
   }
}

void Thread2()
{    
   for(;;)
   {
      lock (port)
      {
          port.Write("Hi 2");
      }
   }
}

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

Хотя два момента:

  • Я не хотел бы гарантировать, что здесь произойдет.Я не удивлюсь тому, что один поток все еще будет писать достаточно долго, так как он может снова получить блокировку до того, как другой поток получит временной интервал.Это будет зависеть от планировщика и от того, сколько у вас ядер.
  • В общем, я предпочитаю блокировать монитор, созданный исключительно для целей блокировки.Вы не знаете, какой другой код внутри SerialPort может заблокировать его монитор.
...