99热这里只有精品2-99热这里只有精品6免费-99热这里只有精品国产99-99热这里只有精品国产99热门精品-99热这里只有精品国产动漫

編程代碼
新聞詳情

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

發(fā)布時(shí)間:2021-01-04 09:28:40 瀏覽次數(shù):2250

還是那個(gè)問(wèn)題,編程世界中學(xué)習(xí)一個(gè)新的技術(shù)點(diǎn),一定要明白一件事,為什么要出現(xiàn)這個(gè)技術(shù)點(diǎn),只有弄懂了這個(gè)才能從根本上有學(xué)習(xí)的動(dòng)力。那么為什么要出現(xiàn)多線程鎖這個(gè)東西呢?一句話概括的話。

為了保證數(shù)據(jù)的準(zhǔn)確性!


計(jì)算機(jī)就是為了計(jì)算數(shù)據(jù)才誕生的,如果不能保證數(shù)據(jù)準(zhǔn)確的話,任何技術(shù)都只是空中樓閣,多線程技術(shù)也是一樣,那么為什么多線程會(huì)讓數(shù)據(jù)不準(zhǔn)確呢?大家可以看下以下的這個(gè)例子

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

}

輸出結(jié)果

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

大家可以看到產(chǎn)生了一個(gè)很奇怪的現(xiàn)象,按理說(shuō)輸出“print thread:”之后應(yīng)該跟著i的值,但是i的值卻跑到“print main:”的后面了,這顯然不是我們能要的結(jié)果,那為什么會(huì)這樣呢?因?yàn)槎嗑€程執(zhí)行的話,是操作系統(tǒng)內(nèi)部控制的,一般是通過(guò)時(shí)間片輪詢來(lái)輪流執(zhí)行的,甚至在多核CPU下是并行執(zhí)行的。

那么怎么解決這個(gè)問(wèn)題呢?以便我們?cè)谝粋€(gè)線程里處理完我們所需要的數(shù)據(jù)之后,然后才將控制權(quán)交出呢?這個(gè)就是用到鎖這個(gè)東西。

假設(shè)線程A在執(zhí)行cout << "print thread: " << i << endl;這個(gè)代碼之前,在前面鎖住一下,當(dāng)線程B想來(lái)?yè)寠Z控制權(quán)的時(shí)候,發(fā)現(xiàn)這個(gè)地方已經(jīng)被上鎖了,無(wú)法搶奪,只能等待,等待它釋放。執(zhí)行完那個(gè)代碼之后就可以釋放鎖,然后B線程就是來(lái)?yè)寠Z控制權(quán)了,一旦B獲得了控制權(quán)也給自己上了鎖,防止在執(zhí)行關(guān)鍵地方的時(shí)候被別人奪去控制權(quán)。那么C++如何實(shí)現(xiàn)加鎖的過(guò)程的呢?

C++當(dāng)中用到的一個(gè)類是mutex,這個(gè)中文就是互斥量的意思,顧名思義,就是一個(gè)時(shí)刻只能有一個(gè)訪問(wèn),以下是代碼

#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;
}

在需要加鎖的地方,調(diào)用metex的lock()方法,解鎖的地方unloc()方法,這樣就可以順序的輸出了所需要的結(jié)果了。

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

以上就是C++中關(guān)于互斥鎖的機(jī)制,相當(dāng)?shù)暮?jiǎn)單容易理解。

在線客服 雙翌客服
客服電話
  • 0755-23712116
  • 13310869691
主站蜘蛛池模板: 一级特黄特交牲大片| 亚洲第一欧美| 日韩中文字幕在线| 伊人思思| 国产不卡视频一区二区在线观看 | 国产精品入口麻豆免费| 色吧dvd| 2021最新国产成人精品视频| 久草在线观看福利| 北条麻妃一区二区三区| 全黄一级裸片视频在线观看| 国产三级在线视频观看| 国产精品麻豆va在线播放| 寡妇一级a毛片免费播放| 国产限制路线1线路2线路3| 欧美日韩国产综合视频一区二区三区 | 一一级黄色片| 中文字幕精品视频在线观看| 免费一级淫片aa| 欧美精品大片| 国产自自拍| 国产精品嫩草影院在线播放| 精品成人一区二区三区免费视频 | 日本成片| 亚洲人成网站在线观看播放青青| 你懂的最新网址| 欧美日韩中文在线视频| 国产大片黄在线看免费| 国产黄色在线视频| 美女被靠视频免费网站不需要会员| 8090碰成年女人免费碰碰尤物| 国产露出调教91| 国产永久免费高清动作片www| 欧美日韩综合| 日本内谢69xxxx免费播放| 亚洲成人网在线观看| 亚洲综合欧美| 在线免费影院| 在线v| 亚洲在线观看一区二区| 在线欧美精品国产综合五月|