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とスレッド2が必要です..助けてください。

ありがとう。

4

1 に答える 1

2

同じポートを使用している場合、同時に印刷することはできません...しかし、あなたはこれを意味するかもしれません:

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

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

ここでは、書き込み中のみロックを取得します。そのため、別のスレッドが入ってきて、ロックを解放した後にロックを取得する可能性があります。

ただし、2つのポイント:

  • ここで何が起こるかは保証したくありません。もう一方のスレッドがタイムスライスを取得する前に、ロックを再取得する可能性があるため、1 つのスレッドがまだかなり長い間書き込みを行っていても驚かないでしょう。これは、スケジューラとコアの数によって異なります。
  • 一般的に言えば、私はロック専用に作成されたモニターをロックすることを好みます。SerialPort内部の他のコードがモニターをロックする可能性があるかどうかはわかりません。
于 2010-07-29T07:39:01.603 に答える