C ++:线程同步

时间:2011-05-10 19:44:51

标签: c++ boost synchronization mutex condition-variable

我正在尝试使用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();
...

2 个答案:

答案 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。