我正在尝试使用Boost库同步两个线程(在同一个C ++映射上工作)。我必须告诉我,我不是C ++方面的专家,我发现提升文档很难理解。
我想要实现的目标是这样的:
#Thread 1
get access to the map
put in something
release access
#Thread 2
wait until map is empty
when it's not empty anymore, wake up and gain access
perform operations on one entry of the map
leave access to somebody else
我尝试使用Mutex和condition_variables,但代码无法正常工作。具体来说,当thread2被唤醒时(在等待cond。变量之后),它没有直接访问地图,但是还有其他人访问并清空了地图。因此,我得到了分段错误,因为当我访问它时,我希望地图是空的。
此外,我想了解mymutex.lock()
之类的内容与boost::mutex::scoped_lock scopedLock(mutex_)
之类的调用之间的区别;
或unique_lock
。
感谢您的教学:)
编辑:在这里,我尝试提取代码的相关部分。由于我不太了解同步是如何工作的,所以它可能没什么意义......//COMMON PART
boost::mutex mutex1;
boost::mutex mutex2;
boost::condition_variable cond;
boost::mutex::scoped_lock mutex2lock(mutex2);
//THREAD 1
...
if(someCondition){
mutex1.lock();
map[id]=message;
cond.notify_one();
mutex1.unlock();
}
...
//THREAD 2
...
cond.wait(mutex2lock);
mutex.lock();
//Perform operation on map[id]
doSomething(map[id]));
mutex.unlock();
...
答案 0 :(得分:2)
另外,我想 了解之间的区别 像mymutex.lock()和 像这样的邀请 提高::互斥:: scoped_lock中 scopedLock(mutex_);或unique_lock。
Google for“c ++ RAII”:
使用mymutex.lock()
,您可以“手动”锁定互斥锁。 (后来必须“手动”解锁它。)
scoped_lock是一个帮助程序类,可以为您执行锁定 - 并在其作用域结束时自动解锁。
答案 1 :(得分:1)
boost::mutex::scoped_lock mutex2lock(mutex2);
如果我理解正确的话,这应该是对mutex2的一个很大的锁定,它会持续你的Mutex的长度。
可能你想在第二个线程的上下文中锁定,但我不太明白为什么condition_variable需要它。
事实上,看起来condition_variable本身对你正在做的事情有点不对,阅读文档:
以原子方式调用lock.unlock()并阻止当前线程。通过调用this-> notify_one()或this-> notify_all()或虚假
通知线程将取消阻止
在我看来,它可以在感觉可以运行时解锁(可能基于时间)似乎您可能需要检查列表是否有效,如果没有,请再次呼叫等待,如果你打算使用condition_variable。