2010-07-29 53 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