как переключиться между потоками при блокировке порта?

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"
}

вывод: (в Гипертерминале)

Hi 1
Hi 1
Hi 1

здесь, поскольку thread1 заблокирован и находится в бесконечном цикле, таким образом, не выход thread1 вообще.. но мне нужны thread1 и thread2 для печати одновременно.. Выручите меня.

Спасибо.

1
задан Darin Dimitrov 29 July 2010 в 07:36
поделиться

1 ответ

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

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

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

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

Два момента:

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

Похожие вопросы: