• std::lock_guard shared_ptr


    #include <iostream>
    #include <memory>
    #include <thread>
    #include <chrono>
    #include <mutex>
    
    struct Test
    {
        Test() { std::cout << "  Test::Test()
    "; }
        ~Test() { std::cout << "  Test::~Test()
    "; }
    };
    
    //线程函数
    void thr(std::shared_ptr<Test> p)
    {
        //线程暂停1s
        std::this_thread::sleep_for(std::chrono::seconds(1));
    
        //赋值操作, shared_ptr引用计数use_cont加1(c++11中是原子操作)
        std::shared_ptr<Test> lp = p;
        {
            //static变量(单例模式),多线程同步用
            static std::mutex io_mutex;
    
            //std::lock_guard加锁
            std::lock_guard<std::mutex> lk(io_mutex);
            std::cout << "local pointer in a thread:
    "
                      << "  lp.get() = " << lp.get()
                      << ", lp.use_count() = " << lp.use_count() << '
    ';
        }
    }
    
    int main()
    {
        //使用make_shared一次分配好需要内存
        std::shared_ptr<Test> p = std::make_shared<Test>();
        //std::shared_ptr<Test> p(new Test);
    
        std::cout << "Created a shared Test
    "
                  << "  p.get() = " << p.get()
                  << ", p.use_count() = " << p.use_count() << '
    ';
    
        //创建三个线程,t1,t2,t3
        //形参作为拷贝, 引用计数也会加1
        std::thread t1(thr, p), t2(thr, p), t3(thr, p);
        std::cout << "Shared ownership between 3 threads and released
    "
                  << "ownership from main:
    "
                  << "  p.get() = " << p.get()
                  << ", p.use_count() = " << p.use_count() << '
    ';
        //等待结束
        t1.join(); t2.join(); t3.join();
        std::cout << "All threads completed, the last one deleted
    ";
    
        return 0;
    }
    root@ubuntu:~/c++# ./share4
      Test::Test()
    Created a shared Test
      p.get() = 0xaaaaccc75e80, p.use_count() = 1
    Shared ownership between 3 threads and released
    ownership from main:
      p.get() = 0xaaaaccc75e80, p.use_count() = 4
    local pointer in a thread:
      lp.get() = 0xaaaaccc75e80, lp.use_count() = 5
    local pointer in a thread:
      lp.get() = 0xaaaaccc75e80, lp.use_count() = 4
    local pointer in a thread:
      lp.get() = 0xaaaaccc75e80, lp.use_count() = 3
    All threads completed, the last one deleted
      Test::~Test()
    #include <iostream>
    #include <memory>
    #include <thread>
    #include <chrono>
    #include <mutex>
    
    struct Test
    {
        Test() { std::cout << "  Test::Test()
    "; }
        ~Test() { std::cout << "  Test::~Test()
    "; }
    };
    
    //线程函数
    void thr(std::shared_ptr<Test> p)
    {
        //线程暂停1s
        std::this_thread::sleep_for(std::chrono::seconds(1));
    
        //赋值操作, shared_ptr引用计数use_cont加1(c++11中是原子操作)
        std::shared_ptr<Test> lp = p;
        {
            //static变量(单例模式),多线程同步用
            static std::mutex io_mutex;
    
            //std::lock_guard加锁
            std::lock_guard<std::mutex> lk(io_mutex);
            std::cout << "local pointer in a thread:
    "
                      << "  lp.get() = " << lp.get()
                      << ", lp.use_count() = " << lp.use_count() << '
    ';
        }
    }
    
    int main()
    {
        //使用make_shared一次分配好需要内存
        std::shared_ptr<Test> p = std::make_shared<Test>();
        //std::shared_ptr<Test> p(new Test);
    
        std::cout << "Created a shared Test
    "
                  << "  p.get() = " << p.get()
                  << ", p.use_count() = " << p.use_count() << '
    ';
    
        //形参作为拷贝, 引用计数也会加1
        std::thread t1(thr, p);
        std::cout << "Shared ownership between 3 threads and released
    "
                  << "ownership from main:
    "
                  << "  p.get() = " << p.get()
                  << ", p.use_count() = " << p.use_count() << '
    ';
        std::cout << "All threads completed, the last one deleted
    ";
         t1.join();
        return 0;
    }
     Test::Test()
    Created a shared Test
      p.get() = 0xaaaadf9e3e80, p.use_count() = 1
    Shared ownership between 3 threads and released
    ownership from main:
      p.get() = 0xaaaadf9e3e80, p.use_count() = 2
    All threads completed, the last one deleted
    local pointer in a thread:
      lp.get() = 0xaaaadf9e3e80, lp.use_count() = 3
      Test::~Test()
  • 相关阅读:
    laravel 表单接收
    Ubuntu查找通过apt命令已安装软件
    Centos7.2源码编译安装LA(N)MP
    文件和目录权限
    第六天 软件安装和管理
    第五天用户和组群账户管理
    第四天 文件和目录操作
    第三天 目录和文件
    第二天 linux命令
    oracle数据库学习第一天
  • 原文地址:https://www.cnblogs.com/dream397/p/14685321.html
Copyright © 2020-2023  润新知