【问题标题】:Threads using the same resource使用相同资源的线程
【发布时间】:2014-01-18 23:22:32
【问题描述】:

我有 C# 多线程程序,它通过 c++ COM 对象使用 UART。我正在从几个线程访问 UART,但声音不大。 亩解决方案:

  1. 仅从一个线程访问 UART 并在每个周期开始时执行所有其他线程请求。这个解决方案的问题是所有其他线程在收到响应之前都会等待很长时间。
  2. 创建只有他才能访问 UART 的优先线程。这个解决方案的问题是它非常危险。 什么解决方案是最好的,为什么?还有其他解决方案吗?

【问题讨论】:

  • 您为什么认为选项 2“有风险”?有什么特别的原因(因为它似乎比选项 1 更安全/更容易理解,其中线程似乎也在做一些其他不相关的工作)?
  • 这是有风险的,因为需要更改所有现有产品,并且在用户升级后可能会导致错误。
  • 你确定1真的有问题吗?您是否实际测量过是否确实“在收到响应之前有很多时间”并且该时间不是归因于设备/UART 的缓慢?
  • 是的,我敢肯定,因为线程 1 中的每个循环都可能需要第二个甚至更多时间。

标签: c# .net multithreading uart


【解决方案1】:

我建议使用专用线程从ConcurrentQueue 中提取请求并在 UART 上运行。 所有其他线程应该Enqueue 请求并继续他们的工作,因此不涉及等待。这符合您的需求吗?

这是ConcurrentQueue的文档

【讨论】:

  • +1。在这种情况下,专用线程(选项 2)似乎非常直接(并且是预期的)解决方案。
  • 我可以将它用作优先队列吗?这意味着来自线程 1 的所有请求都将在来自线程 2 的请求之前执行?
  • 在这种情况下使用 2 个队列更清楚。一个为高优先级,第二个为其他。只要确保首先从高优先级出列即可。
猜你喜欢
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2021-08-26
  • 1970-01-01
  • 2019-03-25
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多