C++:线程同步
C++: thread sync
我正在尝试使用 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。
- 在C++中同步线程
- 将 10 个线程与原子布尔值同步
- 线程过程中的线程同步问题
- 如何定期同步线程?
- 同步线程安全的API,用于暴露缓存数据
- 如何在 pthreads 中正确同步线程
- 通过shared_ptr同步:线程清理器误报
- 如何同步线程以捕获相同数量的帧
- 同步线程和信号
- 使用条件变量(监视器)同步线程
- 同步线程创建和销毁(静态)对象
- NVIDA的CUDA"__syncthreads()"在传统C++中的等价物是什么。如何专业地同步线程?
- 使用事件同步线程
- 如何同步线程(消费者/生产者)
- 以最优雅的方式同步线程
- 使用互斥锁同步线程
- 计算着色器-如何全局同步线程
- GPU for loops:避免扭曲发散和隐式同步线程
- 如果已知访问顺序是安全的,如何在没有互斥锁的情况下同步线程/CPU
- Qt - 同步线程不起作用 - 线程停止但实际上不会停止,有时在不应该停止的时候停止