C++11多執行緒程式設計(二)——互斥鎖mutex用法
還是那個問題,程式設計世界中學習一個新的技術點,一定要明白一件事,為什麼要出現這個技術點,只有弄懂了這個才能從根本上有學習的動力。那麼為什麼要出現多執行緒鎖這個東西呢?一句話概括的話。
為了保證資料的準確性!
計算機就是為了計算資料才誕生的,如果不能保證資料準確的話,任何技術都只是空中樓閣,多執行緒技術也是一樣,那麼為什麼多執行緒會讓資料不準確呢?大家可以看下以下的這個例子
#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;
}
輸出結果
大家可以看到產生了一個很奇怪的現象,按理說輸出“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++中關於互斥鎖的機制,相當的簡單容易理解。
更多精彩內容,請關注同名公眾:一點筆記alittle
相關文章
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- 【C++11多執行緒入門教程】系列之互斥量mutexC++執行緒Mutex
- 多執行緒程式設計ExecutorService用法執行緒程式設計
- 執行緒同步與互斥:互斥鎖執行緒
- Linux多執行緒的使用一:互斥鎖Linux執行緒
- 執行緒的互斥鎖執行緒
- C++11併發程式設計:多執行緒std::threadC++程式設計執行緒thread
- C++-(25)-多執行緒-POSIX(3)-互斥量-pthread_mutexC++執行緒threadMutex
- Java多執行緒程式設計—鎖優化Java執行緒程式設計優化
- 多執行緒併發程式設計“鎖”事執行緒程式設計
- 畫江湖之 PHP 多執行緒開發 【執行緒安全 互斥鎖】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [執行緒安全 互斥鎖]PHP執行緒
- Linux之執行緒互斥鎖Linux執行緒
- Go 互斥鎖 Mutex 原始碼分析(二)GoMutex原始碼
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- Python並行程式設計(二):多執行緒鎖機制利用Lock與RLock實現執行緒同步Python並行行程程式設計執行緒
- C#多執行緒(4):程式同步Mutex類C#執行緒Mutex
- python 多執行緒程式設計Python執行緒程式設計
- JavaScript多執行緒程式設計JavaScript執行緒程式設計
- Python多執行緒程式設計Python執行緒程式設計
- 執行緒安全: 互斥鎖和自旋鎖(10種)執行緒
- 【多執行緒高併發程式設計】二 實現多執行緒的幾種方式執行緒程式設計
- 多執行緒(二)、內建鎖 synchronized執行緒synchronized
- PHP 互斥鎖:如何確保程式碼的執行緒安全?PHP執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- Go 語言併發程式設計之互斥鎖詳解 sync.MutexGo程式設計Mutex
- 多執行緒程式設計進階——Java類庫中的鎖執行緒程式設計Java
- 29. 多執行緒程式設計執行緒程式設計
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- 多執行緒_鎖執行緒
- Linux Qt使用POSIX多執行緒條件變數、互斥鎖(量)LinuxQT執行緒變數
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- Java多執行緒(2)執行緒鎖Java執行緒
- 多執行緒程式設計總結:一、認識多執行緒本質執行緒程式設計
- 純Mutex實現多執行緒交替列印Mutex執行緒
- Go語言的互斥鎖MutexGoMutex
- 深入理解多執行緒程式設計執行緒程式設計
- [02] 多執行緒邏輯程式設計執行緒程式設計