如何在锁定端口的同时在线程之间切换?

发布于 2024-09-11 17:51:35 字数 377 浏览 5 评论 0原文

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

谢谢。

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

output:(in Hyper-Terminal)

Hi 1
Hi 1
Hi 1

here as thread1 is locked and is in a infinite loop, so its not coming out of thread1 at all.. but i need thread1 and thread2 to print simultaneously.. Please help me out.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

柠檬色的秋千 2024-09-18 17:51:35

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

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

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

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

但有两点:

  • 我不想保证这里会发生什么。看到一个线程仍然写入相当长一段时间我不会感到惊讶,因为它可能会在另一个线程获得时间片之前重新获取锁。这将取决于调度程序以及您拥有的核心数量。
  • 一般来说,我更喜欢锁定仅为了锁定目的而创建的监视器。您不知道 SerialPort 中的其他哪些代码可能会锁定其监视器。

Well they can't print simultaneously if they're using the same port... but you might mean this:

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

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

Here we only acquire the lock for the duration of the write - so there's a chance for another thread to come in and acquire the lock after we've released it.

Two points though:

  • I wouldn't like to guarantee what will happen here. I wouldn't be surprised to see one thread still write for quite a long time, as it may get to reacquire the lock before the other thread gets a timeslice. It will depend on the scheduler and how many cores you have.
  • Generally speaking I prefer to lock on a monitor created solely for the purposes of locking. You don't know what other code inside SerialPort may lock on its monitor.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文