在做多執行緒程式設計時,有兩個場景我們都會遇到:
今天我用乙個簡單的例子來給大家介紹下鎖和條件變數的使用。
**使用c++11
示例**
#include
#include
#include
#include
std::mutex g_mutex; // 用到的全域性鎖
std::condition_variable g_cond; // 用到的條件變數
int g_i = 0;
bool g_running = true;
void threadfunc(int n) 作用域後鎖釋放
++g_i;
std::cout << "plus g_i by func thread " << std::this_thread::get_id() << std::endl;
} }std::unique_lock<:mutex> lock(g_mutex); // 加鎖
while (g_running)
std::cout << "func thread exit" << std::endl;
}int main() }
t1.join(); // 等待執行緒t1結束
std::cout << "g_i = " << g_i << std::endl;
}程式執行後,關鍵輸出如下:
plus g_i by main thread 139921025066816
plus g_i by main thread 139921025066816
plus g_i by func thread 139921006847744
plus g_i by func thread 139921006847744
plus g_i by func thread 139921006847744
plus g_i by func thread 139921006847744
plus g_i by func thread 139921006847744
wait for exit // func thread等待main thread發來的退出訊號
plus g_i by main thread 139921025066816
plus g_i by main thread 139921025066816
plus g_i by main thread 139921025066816
plus g_i by main thread 139921025066816
plus g_i by main thread 139921025066816
plus g_i by main thread 139921025066816
plus g_i by main thread 139921025066816
plus g_i by main thread 139921025066816
plus g_i by main thread 139921025066816
plus g_i by main thread 139921025066816
func thread exit
g_i = 200 // 鎖機制保證了g_i的正確
可以看到:
std::this_thread::get_id()
g_i加鎖方法介紹
加鎖相關的**為:
要點為:
這樣就實現了加鎖和解鎖的過程,為什麼不直接呼叫加鎖解鎖方法呢?
我想,這是因為如果加鎖和解鎖中間的**出現了問題,導致執行緒函式異常nsxgmg退出,那麼這個鎖就一直無法得到釋放,其它執行緒處理的不好的話,就會造成死鎖了。
條件變數使用介紹
結束語本文標題: c++多執行緒中的鎖和條件變數使用教程
本文位址:
多執行緒的互斥鎖和條件變數
執行緒間的互斥的同步一直是乙個很重要的地方,在這裡做個總結 所用的介面 int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg void pthread exit v...
多執行緒中條件變數的使用
如果想要實現在乙個執行緒中需要一直等待某種條件被滿足的時候,該執行緒才會進行處理,這個時候可以使用條件變數的方式來實現 乙個執行緒中進行wait,另一線程中當條件滿足時發出通知notify,這樣就不需要一直進行while迴圈進行判斷條件了 例如生產者和消費者情況 include include in...
c 多執行緒交替列印 條件變數 鎖
主要知識 多執行緒,條件變數,鎖。這裡其實有乙個難點,當然可以在看了 之後再回頭來看,就是對std condition variable wait方法的理解。這裡解釋一下,當執行wait方法時,鎖是會被解開的以便別的執行緒使用資源,但是呼叫wait的執行緒會被阻塞直到別的執行緒呼叫notify等一系...