使用静态布尔与临界区域进行并发

时间:2014-04-23 23:29:24

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

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

在过去,我有时使用静态布尔来实现线程安全,添加一个等待1ms的循环,直到bool指示代码可以安全进入。我也使用过CriticalSections。任何人都可以告诉我,CriticalSections是否从根本上比使用静态bool更好。我知道我不需要编写一个等待循环的代码,但他们在VC ++中使用什么轮询速率来检查锁的状态?他们是否以某种方式吸引操作系统,使他们变得更好?使用bool进行并发检查并不总是安全吗?等

2 个答案:

答案 0 :(得分:1)

我对C ++知之甚少,但并发通常并非通过轮询实现,并且通常不应该轮询浪费处理器时间并浪费能源。

是两种主要的低级方法
  1. 阻止锁定,可能是超时。

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

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

答案 1 :(得分:0)

好吧没关系。我只是坚持关键部分。我希望得到一些有关关键部分如何工作的有趣信息,或至少提到有关该文章的文章。 IE - 为什么它们不仅仅是编写自己的轮询循环。我从这个讨论中看到:std::mutex performance compared to win32 CRITICAL_SECTION关于std :: mutex如何工作存在一些混淆,但我认为最好使用CRITICAL_SECTIONS,因为它似乎是最可靠的方法来获得Windows上最快的并发保护。

非常感谢。