2010-07-29 64 views
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 

这里线程1被锁定,处于无限循环,所以它不是从线程1降临在所有..但我需要线程1和线程到同时打印..请帮助我。

谢谢。

+0

将锁移动到for循环中,并阅读一些关于基本线程的文章... – 2010-07-29 07:39:32

回答

2

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

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

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

在这里我们只获得了锁的持续时间写 - 所以在我们释放它之后,有另一个线程进入并获得锁的机会。

两分,但:

  • 我不希望在这里保证会发生什么。看到一个线程仍然写很长时间,我不会感到惊讶,因为它可能会在另一个线程获得时间片之前重新获取锁。这将取决于调度程序以及您拥有多少核心。
  • 一般来说,我更喜欢锁定在为锁定目的而创建的完全为的显示器上。您不知道SerialPort中的其他代码可能锁定在其监视器上。
+0

感谢您的回复。我一直在努力,正如你所说,它在很长一段时间内等待着一个线程。我的事实是,我有12个线程和卡住wt线程1和2本身..你也提到了关于显示器,你可以给它更多的灯光。 谢谢。 – SLp 2010-07-29 08:26:03

+0

@ user403489:锁定语句在监视器上工作 - 实际上有一个监视器与.NET中的每个对象相关联(尽管它们被懒惰地分配)。 – 2010-07-29 09:56:39