女人夜夜春高潮爽A∨片传媒_国产精品VIDEOS麻豆_在线精品亚洲一区二区三区_亚洲熟妇无码av

編程代碼
新聞詳情

C++11多線程編程(二)——互斥鎖mutex用法

發布時(shi)間:2021-01-04 09:28:40 瀏覽次數:2306

還是那個(ge)問題,編程(cheng)世(shi)界中學(xue)習(xi)(xi)一(yi)個(ge)新的技(ji)術點(dian),一(yi)定要明白一(yi)件事,為什(shen)么(me)(me)要出現這個(ge)技(ji)術點(dian),只有(you)(you)弄懂了(le)這個(ge)才能從根(gen)本上有(you)(you)學(xue)習(xi)(xi)的動力。那么(me)(me)為什(shen)么(me)(me)要出現多(duo)線程(cheng)鎖這個(ge)東(dong)西呢?一(yi)句話概(gai)括的話。

為了保證數據的準確性!


計算機就是為了計算數據才誕生(sheng)的(de),如果不能保證數據準(zhun)確(que)的(de)話,任(ren)何技(ji)(ji)術都只是空中樓閣,多(duo)線(xian)程(cheng)技(ji)(ji)術也(ye)是一樣,那么為什(shen)么多(duo)線(xian)程(cheng)會讓(rang)數據不準(zhun)確(que)呢?大家可(ke)以(yi)看(kan)下(xia)以(yi)下(xia)的(de)這個例子(zi)

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

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

}

輸出結果

C++11多線程編程(二)——互斥鎖mutex用法

大(da)家可以看到(dao)(dao)產生(sheng)了(le)一個很奇怪的(de)現象,按理說(shuo)輸出“print thread:”之后(hou)應該(gai)跟著i的(de)值,但(dan)是i的(de)值卻(que)跑到(dao)(dao)“print main:”的(de)后(hou)面了(le),這(zhe)顯然不(bu)是我們(men)能(neng)要(yao)的(de)結果,那為什(shen)么(me)會這(zhe)樣呢?因為多線(xian)程執(zhi)(zhi)行的(de)話(hua),是操作系統(tong)內部控(kong)制的(de),一般是通過時間片(pian)輪(lun)詢來輪(lun)流執(zhi)(zhi)行的(de),甚至(zhi)在多核CPU下(xia)是并行執(zhi)(zhi)行的(de)。

那么(me)怎么(me)解決這(zhe)個(ge)(ge)(ge)問(wen)題呢?以便我們在一個(ge)(ge)(ge)線程(cheng)里處理完我們所需要(yao)的數據之后(hou),然(ran)后(hou)才將控制權交出呢?這(zhe)個(ge)(ge)(ge)就是用到鎖這(zhe)個(ge)(ge)(ge)東西。

假設線程(cheng)A在(zai)(zai)執(zhi)(zhi)(zhi)行cout << "print thread: " << i << endl;這個代(dai)碼(ma)(ma)之(zhi)前,在(zai)(zai)前面(mian)鎖住一下,當線程(cheng)B想來(lai)搶奪(duo)控制權的時(shi)候,發現(xian)這個地方(fang)已經被(bei)上鎖了(le),無法搶奪(duo),只能(neng)等待(dai),等待(dai)它釋(shi)放(fang)。執(zhi)(zhi)(zhi)行完(wan)那(nei)個代(dai)碼(ma)(ma)之(zhi)后(hou)就可以釋(shi)放(fang)鎖,然后(hou)B線程(cheng)就是來(lai)搶奪(duo)控制權了(le),一旦B獲(huo)得(de)了(le)控制權也給(gei)自己上了(le)鎖,防(fang)止(zhi)在(zai)(zai)執(zhi)(zhi)(zhi)行關鍵地方(fang)的時(shi)候被(bei)別(bie)人奪(duo)去控制權。那(nei)么C++如何(he)實現(xian)加(jia)鎖的過程(cheng)的呢?

C++當(dang)中(zhong)(zhong)用到的一個(ge)類是(shi)(shi)mutex,這個(ge)中(zhong)(zhong)文就是(shi)(shi)互斥(chi)量的意思,顧名思義(yi),就是(shi)(shi)一個(ge)時刻(ke)只(zhi)能有一個(ge)訪問,以下(xia)是(shi)(shi)代碼

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

mutex mt;
void thread_task()
{
    for (int i = 0; i < 10; i++)
    {
        mt.lock();
        cout << "print thread: " << i << endl;
        mt.unlock();
    }
}

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

在(zai)需要(yao)加鎖的(de)(de)地方,調用metex的(de)(de)lock()方法,解鎖的(de)(de)地方unloc()方法,這樣就可以順(shun)序的(de)(de)輸出了所需要(yao)的(de)(de)結果了。

C++11多線程編程(二)——互斥鎖mutex用法

以上(shang)就是(shi)C++中關于互斥鎖的機制,相當的簡單容易理解。

在(zai)線客服
客服(fu)電話
  • 0755-23712116
  • 13310869691