C++11多執行緒程式設計(二)——互斥鎖mutex用法

_kiwi_發表於2020-12-06

還是那個問題,程式設計世界中學習一個新的技術點,一定要明白一件事,為什麼要出現這個技術點,只有弄懂了這個才能從根本上有學習的動力。那麼為什麼要出現多執行緒鎖這個東西呢?一句話概括的話。

為了保證資料的準確性!

 

計算機就是為了計算資料才誕生的,如果不能保證資料準確的話,任何技術都只是空中樓閣,多執行緒技術也是一樣,那麼為什麼多執行緒會讓資料不準確呢?大家可以看下以下的這個例子

#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用法

大家可以看到產生了一個很奇怪的現象,按理說輸出“print thread:”之後應該跟著i的值,但是i的值卻跑到“print main:”的後面了,這顯然不是我們能要的結果,那為什麼會這樣呢?因為多執行緒執行的話,是作業系統內部控制的,一般是通過時間片輪詢來輪流執行的,甚至在多核CPU下是並行執行的。

那麼怎麼解決這個問題呢?以便我們在一個執行緒裡處理完我們所需要的資料之後,然後才將控制權交出呢?這個就是用到鎖這個東西。

假設執行緒A在執行cout << "print thread: " << i << endl;這個程式碼之前,在前面鎖住一下,當執行緒B想來搶奪控制權的時候,發現這個地方已經被上鎖了,無法搶奪,只能等待,等待它釋放。執行完那個程式碼之後就可以釋放鎖,然後B執行緒就是來搶奪控制權了,一旦B獲得了控制權也給自己上了鎖,防止在執行關鍵地方的時候被別人奪去控制權。那麼C++如何實現加鎖的過程的呢?

C++當中用到的一個類是mutex,這個中文就是互斥量的意思,顧名思義,就是一個時刻只能有一個訪問,以下是程式碼

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

在需要加鎖的地方,呼叫metex的lock()方法,解鎖的地方unloc()方法,這樣就可以順序的輸出了所需要的結果了。

C++11多執行緒程式設計(二)——互斥鎖mutex用法

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

更多精彩內容,請關注同名公眾:一點筆記alittle

相關文章