【问题标题】:Using static boolean vs. critical section for concurrency使用静态布尔值与临界区进行并发
【发布时间】:2014-04-23 23:29:23
【问题描述】:

所以我正在为 USB HID 设备设计一个新的软件界面,我有一个关于并发保护的问题。我假设我必须在对 ReadFile 和 WriteFile 的调用周围添加并发保护(如果错误,请纠正我),因为它们可能是从我设计中的不同线程调用的。

过去我有时使用静态布尔值来实现线程安全,添加一个等待 1 毫秒的循环,直到布尔值表明代码可以安全输入。我也使用过关键部分。谁能告诉我 CriticalSections 从根本上是否比使用静态布尔值更好。我知道我不必编写等待循环,但是他们在 VC++ 中使用什么轮询率来检查锁的状态?他们是否以某种使他们变得更好的方式与操作系统挂钩?使用布尔值进行并发检查并不总是安全的吗?等等

【问题讨论】:

  • C++11 向标准库添加了线程支持,您应该考虑使用 std::mutex 之类的东西
  • 不,互斥锁太贵了。 CriticalSections 应该这样做。我会在标准库中寻找它们。
  • 我看到std::mutex不一定是windows mutex,但可以实现为CS。

标签: visual-c++ concurrency critical-section


【解决方案1】:

我对 C++ 了解不多,但是并发通常通过轮询实现,通常也不应该——轮询浪费处理器时间和能源。两种主要的低级方法是

  1. 阻塞锁,可能超时。

  2. 使用无锁原语,很可能是比较和设置或比较和交换。

典型的现代硬件都支持这些方法。它们导致了非常不同的交互“风味”。编写无锁数据结构最好留给专家(它们往往很复杂,更重要的是,很难看出它们是否正确以及它们是否保证在面对争用时取得进展——它们的描述通常是附有证明页)。幸运的是,您可以获取它们的库,并且在许多但并非所有情况下,它们都比阻塞的更快、性能更好。

【讨论】:

  • 不确定什么是无锁结构或原语,但我不保护数据结构,只是保护 USB 输入/输出。
【解决方案2】:

没关系。我会坚持使用关键部分。我希望获得一些关于关键部分如何工作的有趣信息,或者至少是对一篇关于此的文章的参考。 IE - 为什么它们与编写自己的轮询循环不同。我从这个讨论中看到:std::mutex performance compared to win32 CRITICAL_SECTION 对 std::mutex 的工作方式有些困惑,但我认为最好使用 CRITICAL_SECTIONS ,因为它似乎是获得最快并发保护的最可靠方法视窗。

还是谢谢。

【讨论】:

    猜你喜欢
    • 2022-11-17
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2012-11-08
    • 2020-06-04
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多