1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        C++ std::lock_guard詳解

        共 384字,需瀏覽 1分鐘

         ·

        2021-12-23 13:46


        01

        std::lock_guard詳解


        std::lock_guard屬于C++11特性,鎖管理遵循RAII習(xí)語管理資源,鎖管理器在構(gòu)造函數(shù)中自動(dòng)綁定它的互斥體并加鎖,在析構(gòu)函數(shù)中解鎖,大大減少了死鎖的風(fēng)險(xiǎn)。下面我們來看一段代碼。


        #include?
        #include?
        #include?

        class?Widget{
        public:
        ????Widget() = default;
        ????~Widget() = default;

        ????void?fun(){
        ????????std::lock_guard<std::mutex> lock(lock_);
        ????????std::cout?<< "Widget::fun run"?<< std::endl;
        ????}

        private:
        ????std::mutex lock_;
        };

        void?TestThread1(Widget* w){
        ????w->fun();
        }

        int?main()
        {
        ????Widget* w = new?Widget();
        ????std::thread t1(&TestThread1, w);

        ????t1.join();

        ????return?0;
        }


        這是std::lock_gurad最基本的使用,程序在std::lock_guard生命周期內(nèi)加鎖和解鎖,其中加鎖和解鎖分別在構(gòu)造函數(shù)和析構(gòu)函數(shù)中完成,具體如何我們看下std::lock_guard的構(gòu)造函數(shù)和析構(gòu)函數(shù)。

        template <class?_Mutex>
        class?_LIBCPP_TEMPLATE_VIS?_LIBCPP_THREAD_SAFETY_ANNOTATION(scoped_lockable)
        lock_guard
        {
        public:
        ????typedef _Mutex mutex_type;

        private:
        ????mutex_type& __m_;
        public:

        ????_LIBCPP_NODISCARD_EXT _LIBCPP_INLINE_VISIBILITY
        ????explicit lock_guard(mutex_type& __m)?_LIBCPP_THREAD_SAFETY_ANNOTATION(acquire_capability(__m))
        ????????: __m_(__m)?
        {__m_.lock();}

        ????_LIBCPP_NODISCARD_EXT _LIBCPP_INLINE_VISIBILITY
        ????lock_guard(mutex_type& __m, adopt_lock_t)?_LIBCPP_THREAD_SAFETY_ANNOTATION(requires_capability(__m))
        ????????: __m_(__m)?
        {}
        ????_LIBCPP_INLINE_VISIBILITY
        ????~lock_guard() _LIBCPP_THREAD_SAFETY_ANNOTATION(release_capability()) {__m_.unlock();}

        private:
        ????lock_guard(lock_guard const&) _LIBCPP_EQUAL_DELETE;
        ????lock_guard& operator=(lock_guard const&) _LIBCPP_EQUAL_DELETE;
        };
        很明顯,std::lock_guard在構(gòu)造函數(shù)里調(diào)用互斥體的lock函數(shù)進(jìn)行加鎖,在析構(gòu)函數(shù)里調(diào)用互斥體的unlock函數(shù)進(jìn)行解鎖。我們還可以看到std::lock_guard的拷貝構(gòu)造函數(shù)和拷貝賦值運(yùn)算符是私有的,因此std::lock_guard無法進(jìn)行拷貝。

        瀏覽 300
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            性,国产三级视频 | 天天超碰 | 亚洲第十页色逼 | 让男人爽到不行的床技 | 中文无码激情 | 八重神子入夜狂飙游戏视频免费观看 | 欧美日韩高清一区二区三区 | 久久久精品成人视频 | 久久三级电影 | 《中国裸体写真》30集在线观看 |