1
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同时打印......请帮帮我。

谢谢。

4

1 回答 1

2

好吧,如果他们使用相同的端口,他们就不能同时打印......但你可能是这个意思:

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

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

在这里,我们只在写入期间获取锁——因此在我们释放锁后,另一个线程有机会进入并获取锁。

不过有两点:

  • 我不想保证这里会发生什么。看到一个线程仍然写了很长时间我不会感到惊讶,因为它可能会在另一个线程获得时间片之前重新获取锁。这取决于调度程序和您拥有的核心数量。
  • 一般来说,我更喜欢锁定专门为锁定目的而创建的监视器。你不知道里面的其他代码SerialPort可能会锁定在它的监视器上。
于 2010-07-29T07:39:01.603 回答