欧美日韩在线第一页-欧美日韩在线观看精品-欧美日韩在线观看一区二区-欧美日韩在线免费看-欧美日韩在线视频不卡一区二区三区

編程代碼
新聞詳情

C++11多線程編程(三)——lock_guard技術(shù)

發(fā)布時間:2021-01-05 11:36:09 瀏覽次數(shù):2639

如果熟悉C++多線程的童鞋可能有了解到實現(xiàn)的互斥鎖的機制還有這個寫法

lock_guard<mutex> guard(mt);

那么這句話是什么意思呢?為什么又要搞個這樣的寫法呢?

這個也是構(gòu)造互斥鎖的寫法,就是會在lock_guard構(gòu)造函數(shù)里加鎖,在析構(gòu)函數(shù)里解鎖,之所以搞了這個寫法,C++委員會的解釋是防止使用mutex加鎖解鎖的時候,忘記解鎖unlock了。

#include <iostream>
#include <thread>
#include <string>
#include <mutex>
using namespace std;

mutex mt;
void thread_task()
{
    for (int i = 0; i < 10; i++)
    {
        lock_guard<mutex> guard(mt);
        cout << "print thread: " << i << endl;
    }
}

int main()
{
    thread t(thread_task);
    for (int i = 0; i > -10; i--)
    {
        lock_guard<mutex> guard(mt);
        cout << "print main: " << i << endl;
    }
    t.join();
    return 0;
}

這里說析構(gòu)函數(shù)里解鎖,那么到底什么時候調(diào)用析構(gòu)函數(shù)呢?構(gòu)造函數(shù)加鎖我們好理解,寫下這個語句的時候調(diào)用lock_guard<mutex> guard(mt),那么調(diào)用析構(gòu)函數(shù)應該是大括號{}結(jié)束的時候,也就是說定義lock_guard的時候調(diào)用構(gòu)造函數(shù)加鎖,大括號解鎖的時候調(diào)用析構(gòu)函數(shù)解鎖。

雖然lock_guard挺好用的,但是有個很大的缺陷,在定義lock_guard的地方會調(diào)用構(gòu)造函數(shù)加鎖,在離開定義域的話lock_guard就會被銷毀,調(diào)用析構(gòu)函數(shù)解鎖。這就產(chǎn)生了一個問題,如果這個定義域范圍很大的話,那么鎖的粒度就很大,很大程序上會影響效率。

所以為了解決lock_guard鎖的粒度過大的原因,unique_lock就出現(xiàn)了。

unique_lock<mutex> unique(mt);

這個會在構(gòu)造函數(shù)加鎖,然后可以利用unique.unlock()來解鎖,所以當你覺得鎖的粒度太多的時候,可以利用這個來解鎖,而析構(gòu)的時候會判斷當前鎖的狀態(tài)來決定是否解鎖,如果當前狀態(tài)已經(jīng)是解鎖狀態(tài)了,那么就不會再次解鎖,而如果當前狀態(tài)是加鎖狀態(tài),就會自動調(diào)用unique.unlock()來解鎖。而lock_guard在析構(gòu)的時候一定會解鎖,也沒有中途解鎖的功能。


當然,方便肯定是有代價的,unique_lock內(nèi)部會維護一個鎖的狀態(tài),所以在效率上肯定會比lock_guard慢。

所以,以上兩種加鎖解鎖的方法,加上前面文章介紹的mutex方法,具體該使用哪一個,要依照具體的業(yè)務需求來決定,當然mt.lock()和mt.unlock()不管是哪種情況,是肯定都可以使用的。

對我而言,總感覺這個lock_guard有點雞肋而已,完全可以用mutex來替代,忘記解鎖的話一般都可以通過調(diào)試發(fā)現(xiàn),而且一般情況下都不會忘記。僅僅只是因為怕忘記解鎖這個原因的話,真的感覺有點多此一舉,徒增學習成本罷了。

當然也許C++委員會有他們自己的考慮,對于我們而言,也只能記住就是了。

在線客服 雙翌客服
客服電話
  • 0755-23712116
  • 13310869691
主站蜘蛛池模板: 亚洲特级aaaaaa毛片| 99爱视频精品免视看| 999国内精品永久免费视频| 日韩第八页| 边做边摸边揉的免费视频| 国产精品99久久免费黑人| 色琪琪原网站亚洲香蕉| 久久免费观看国产精品88av| 亚洲国产成人久久精品图片| 国产视频播放| 国产成人精品免费视频动漫| 在线日韩| 1769国产精品视频免费观看| 久久www成人看片| 草草视频免费观看| 成人性色生活影片| 51国产在线| 国产大尺度吃奶无遮无挡网| 国产一区精品| 久久精品视频免费播放| 欧美日韩性| 国产精品天天看天天爽 | 国产一区在线看| 久久黄色免费网站| 久久精品30| 国产人成激情视频在线观看| 午夜看毛片| 欧美日韩国产在线观看一区二区三区 | 国产一级一片| 一级影院| 国产超薄肉色丝袜的免费网站| 国产一级aa大片毛片| 一级毛片免费视频网站| 国产乱码精品一区二区三区四川 | 精品视频vs精品视频| 欧美激情婷婷| 99久久精品国产片久人| 97青青青国产在线播放| 成人精品一级毛片| 亚州精品视频| 国产美女自拍视频|