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