C++:线程同步

C++: thread sync

本文关键字:同步 线程 C++      更新时间:2023-10-16

我正在尝试使用 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

我尝试使用互斥和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();
...

此外,我想 了解两者之间的区别 类似于 mymutex.lock() 和 像这样的调用 boost::mutex::scoped_lock scopedLock(mutex_);或unique_lock。

谷歌搜索"c ++ RAII":

使用mymutex.lock(),您可以"手动"锁定互斥锁。(稍后必须"手动"解锁它。

scoped_lock 是一个帮助程序类,它为您执行锁定 - 并在其作用域结束时自动解锁。

boost::mutex::scoped_lock mutex2lock(mutex2);

如果我理解正确的话,这应该,但是 mutex2 上的一个大锁将持续您的互斥体的长度。

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

事实上,阅读文档,condition_variable本身似乎对您正在做的事情有点不对劲:

原子方式调用 lock.unlock() 并阻止当前线程。线程将在调用 this->notify_one() 或 this->notify_all() 或虚假通知时取消阻止

在我看来,该描述可以在它觉得可以运行时解锁(可能基于时间)似乎您可能需要检查列表是否有效,如果不是,请再次调用等待,如果您打算使用condition_variable。