【发布时间】:2013-06-13 15:03:28
【问题描述】:
正如当前帖子标题所说,boost boost::interprocess::interprocess_condition::wait 假设在等待时原子地解锁互斥锁,但事实并非如此。
在以下代码中:
boost::interprocess::scoped_lock< boost::interprocess::interprocess_mutex > state_access_lock(impl->state->state_access_mut);
impl->state->state_access_cond.wait(state_access_lock);
在 VS2010 进入调试模式时,我按下了暂停键,当我看到 state_access_lock 在等待时仍然被锁定时,我感到很惊讶。
但这不是 boost 的文档所说的 here。
有人有什么建议吗?
谢谢。
【问题讨论】:
-
您对代码的行为有实际的观察还是只是调试器中某个变量的值?
-
我首先意识到了这种行为。因为我的第二个线程应该写然后调用通知,正在等待互斥锁被永久释放。只有在那之后,我才决定使用 VS 调试模式检查我的互斥锁到第一个线程中发生了什么。
-
除了这种根本性的破坏不太可能被忽视之外,各种条件变量的每个单独的代码路径(顺便说一下,你应该指定你正在使用哪个)都会经历解锁互斥锁。所以错误必须在其他地方。尝试发布更多上下文。
-
我在 boost::interprocess::interprocess_condition 的 wait 方法中跟踪执行代码,发现互斥锁本身通过调用
mut.unlock()解锁,但 scoped_lock 本身仍然将 is_locked 设置为 true。所以我很困惑,如果我有这样的 scoped_lock:scoped_lock lk(mut)调用mut.unlock()或lk.unlock()有什么区别?