Multithreading boost共享互斥析构函数
我有一个多线程应用程序,它必须经常读取一些数据,并且偶尔会更新这些数据。我在使用unique_lock进行写入时遇到问题,在使用upgrade_lock进行读取时遇到问题 我的问题有以下几个例子:Multithreading boost共享互斥析构函数,multithreading,visual-studio,boost,mutex,Multithreading,Visual Studio,Boost,Mutex,我有一个多线程应用程序,它必须经常读取一些数据,并且偶尔会更新这些数据。我在使用unique_lock进行写入时遇到问题,在使用upgrade_lock进行读取时遇到问题 我的问题有以下几个例子: void unlock(){ test.stream = 0; test.mtx.unlock(); } void lock_mtx(int i){ boost::unique_lock<boost::shared_mutex> lock(test.mtx);
void unlock(){
test.stream = 0;
test.mtx.unlock();
}
void lock_mtx(int i){
boost::unique_lock<boost::shared_mutex> lock(test.mtx);
test.stream = i;
boost::this_thread::sleep_for(boost::chrono::milliseconds(10000));
unlock();
boost::this_thread::sleep_for(boost::chrono::milliseconds(1000));
}
第二个问题是,当某些线程执行升级锁定时,其他线程无法读取共享对象
这两个问题都出现在MS VisualStudio 2013和Windows8 x64中
void lock_mtx(int i)
{
{
boost::unique_lock<boost::shared_mutex> lock(test.mtx);
test.stream = i;
boost::this_thread::sleep_for(boost::chrono::milliseconds(10000));
}
boost::this_thread::sleep_for(boost::chrono::milliseconds(1000));
}
{
{
boost::unique_lock(test.mtx);
test.stream=i;
boost::this_线程::sleep_for(boost::chrono::毫秒(10000));
}
boost::this_线程::sleep_for(boost::chrono::毫秒(1000));
}
unique\u lock
和lock\u guard
的目的是在互斥锁超出范围时自动解锁。这种模式被称为RAII
经验法则:永远不要在(基本共享)可锁定对象上手动调用lock()
/unlock()
。这是一个反模式,因为
- 很难做到正确(考虑异常安全性)
- 它通常表示代码气味(锁在不同的方法调用之间)。如果你需要这个,考虑制作RAII锁守护程序(<代码> LoopyGue/<代码>或<代码> UnQuyLogObj/<代码>)一个包含类的成员,或者返回<代码> UngQuyLoad >因此调用方可以选择显式<代码>采用< /Cord>锁,或者只是让它由管理员自动释放。
void lock_mtx(int i)
{
{
boost::unique_lock<boost::shared_mutex> lock(test.mtx);
test.stream = i;
boost::this_thread::sleep_for(boost::chrono::milliseconds(10000));
}
boost::this_thread::sleep_for(boost::chrono::milliseconds(1000));
}