1

我正在尝试使用 Boost 库同步两个线程(在同一个 C++ 映射上工作)。我必须说我不是 C++ 专家,而且我发现 boost 文档很难理解。

我想要实现的是这样的:

#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. 变量之后),它并没有直接访问地图,但是还有其他人获得了访问权限并清空了地图。因此,我遇到了分段错误,因为当我访问它时,我期望地图是满的,而它是空的。

另外,我想了解 likemymutex.lock()和 invokations like之间的区别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();
...
4

2 回答 2

2

另外,我想了解 mymutex.lock() 之类的东西和 boost::mutex::scoped_lock scopedLock(mutex_); 之类的调用之间的区别。或unique_lock。

谷歌“c++ RAII”:

mymutex.lock()您一起“手动”锁定互斥锁。(后来必须“手动”解锁它。)

scoped_lock 是一个辅助类,它为您执行锁定 - 并在其范围结束时自动解锁。

于 2011-05-10T19:48:43.760 回答
1
boost::mutex::scoped_lock mutex2lock(mutex2);

如果我理解正确,这应该是 mutex2 上的一个大锁,它将持续你的 Mutex 的长度。

您可能希望在第二个线程的上下文中使用该锁,但我不太明白为什么 condition_variable 需要它。

事实上,看起来 condition_variable 本身对于你正在做的事情有点错误,阅读文档:

原子地调用 lock.unlock() 并阻塞当前线程。当调用 this->notify_one() 或 this->notify_all() 或虚假通知时,线程将解除阻塞

在我看来,该描述似乎可以在它感觉可以运行时解锁(可能基于时间)似乎您可能需要检查列表是否有效,如果不是,请再次致电等待,如果您计划使用条件变量。

于 2011-05-10T20:34:34.023 回答