【问题标题】:Replace critical section with boost::detail::spinlock cause dead lock on windows [closed]用 boost::detail::spinlock 替换关键部分导致 Windows 死锁 [关闭]
【发布时间】:2013-01-20 01:39:35
【问题描述】:

我的平台是 vs2010 win2003 服务器,我有一个运行良好的应用程序。有一个整数受临界区保护,当我修改并使用 boost::detail::spinlock 时,它会进入死锁。

【问题讨论】:

  • Soooo 你是怎么解决这个问题的?
  • 为什么在运行良好的情况下需要进行更改?顺便说一句,这是唯一的改变吗?
  • @DenisErmolin 我用Interlockedxx api暂时解决了,但还是没有找到真正的原因。
  • @Jagannath 因为临界区保护的只是一个整数,所以我想使用自旋锁来提高性能。我确定这是唯一的更改,因为我使用互斥锁或互锁死锁消失了。
  • @magicyang:不,你想使用 ATOMIC。好消息是最新的提升有它们。

标签: c++ windows boost mutex spinlock


【解决方案1】:
  1. boost::<b>detail</b>::spinlock。这意味着它仅供内部使用。如果您想要便携式替换关键部分,请使用boost::mutex from Boost.Thread

  2. boost::detail::<b>spinlock</b>。自旋锁通常忙于等待,这使它们更快,但只能在严格控制的条件下使用。

  3. Boost 1.53(最新版本)终于获得了Boost.Atomic,它是一种可移植(且与 C++11 兼容)的互锁操作替代品。

【讨论】:

  • 如果仅供内部使用,可能是用智能指针或其他方式折叠。我会尝试最新的提升,谢谢。
  • @magicyang:Boost 经常在details 子命名空间中重新实现一些通用基础架构,以保持组件的独立性。但是这样做会做出各种复杂的假设,这些假设只对 boost 代码有效,这使得这些位在您自己的代码中无法使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多