Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading boost共享互斥析构函数_Multithreading_Visual Studio_Boost_Mutex - Fatal编程技术网

Multithreading boost共享互斥析构函数

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);

我有一个多线程应用程序,它必须经常读取一些数据,并且偶尔会更新这些数据。我在使用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);
    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));
}