【问题标题】:Can there be a collision if two threads are writing to the same serial port?如果两个线程正在写入同一个串行端口,是否会发生冲突?
【发布时间】:2012-04-15 13:11:07
【问题描述】:

我正在用 C# 编码。如果两个线程正在写入同一个串行端口,是否会发生冲突? 如果是,我该如何处理?另外,我想优先考虑其中一个线程。

例如,如果两个线程正在写入串行端口,那么当我从线程 2 写入数据时,我想停止线程 1 的传输(即,在写入端口时,线程 2 的优先级高于线程 1)。


非常感谢您的回答。但我的一个问题仍未得到解答。一旦我从线程 1 获得要写入的数据。它应该暂停从其他线程读取/写入并传输此数据,然后继续暂停功能。

【问题讨论】:

  • 这没有多大意义,电缆另一端的设备会变得非常混乱。一般来说,使用互斥体在线程之间进行仲裁。
  • 就像@HansPassant 所说,你在某个任意点“中断”一个线程会将你正在使用的任何协议单元切成小块。 Muxtex,也许吧。如果一个线程将具有“优先级”,则让另一个线程用它想要发送的任何数据向优先级线程发出信号——prio。线程可以在处理完自己的事情后处理它。

标签: c# multithreading serial-port collision


【解决方案1】:

msdn 文档告诉我们:

“线程安全 此类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。” - http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx

所以你需要自己让它线程安全。例如

void thread1()
{
    lock(serialPort1)
    { 
         serialPort1.Write(something);
    }
}
void thread2()
{
    lock(serialPort1)
    { 
         serialPort1.Write(somethingelse);
    }
}

【讨论】:

  • 这只是一个样板短语,没有任何意义。 Write() 方法实际上是线程安全的,驱动程序提供了隐式锁。添加自己的锁不会改变任何事情。
  • 什么? MDSN 文档误导?震惊!恐怖!
  • @MartinJames 实际上并没有误导。文档不保证它是线程安全的,但这并不意味着它不可能。
  • @Grozz - 我觉得有点像律师:(
  • @Grozz 好吧,是的,这个特别的奖品显然属于 Windows ME。
猜你喜欢
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多