互斥鎖,是一種訊號量,常用來防止兩個程序或執行緒在同一時刻訪問相同的共享資源。可以保證以下三點:
原子性:把乙個互斥量鎖定為乙個原子操作,這意味著作業系統(或pthread函式庫)保證了如果乙個執行緒
鎖定了乙個互斥量,沒有其他執行緒在同一時間可以成功鎖定這個互斥量。
唯一性:如果乙個執行緒鎖定了乙個互斥量,在它解除鎖定之前,沒有其他執行緒可以鎖定這個互斥量。
非繁忙等待:如果乙個執行緒已經鎖定了乙個互斥量,第二個執行緒又試圖去鎖定這個互斥量,則第二個執行緒將
被掛起(不占用任何cpu資源),直到第乙個執行緒解除對這個互斥量的鎖定為止,第二個執行緒則被喚
醒並繼續執行,同時鎖定這個互斥量。
從以上三點,我們看出可以用互斥量來保證對變數(關鍵的**段)的排他性訪問。
from
從網上找的**,但是自己還不是很能理解。所以根據這個**進行研究分析。。。
下面的** from
#include
#include
#include
#include
#pragma comment(lib, "pthreadvc2.lib") //必須加上這句
using
namespace
std;
#define num_threads 5
int sum = 0;//定義個全域性變數,讓所有執行緒進行訪問,這樣就會出現同時寫的情況,勢必會需要鎖機制;
pthread_mutex_t sum_mutex;
void* say_hello(void* args)
int main()
} pthread_attr_destroy(&attr);//刪除引數變數
void *status;
for (int i = 0; i < num_threads; ++i)
} cout
<< "finally sum is "
<< sum << endl;
pthread_mutex_destroy(&sum_mutex);//登出鎖,可以看出使用pthread內建變數神馬的都對應了銷毀函式,估計是記憶體洩露相關的吧;
system("pause");
return
0;}
執行結果如下:
hello in
thread hello in
thread
1hello in
thread
3hello in
thread
2hello in thre
ad 40
before sum is 0
inthread
4after sum is 4
inthread
4before sum is 4
inthread
2after sum is 6
inthread
2before sum is 6
inthread
1after sum is 7
inthread
1before sum is 7
inthread
3after sum is 10
inthread
3before sum is 10
inthread
0after sum is 10
inthread
0finally sum is 10
請按任意鍵繼續...
//多執行緒的順序是混亂的,混亂就是正常;只要sum訪問及修改是正常的,就達到多執行緒的目的了,執行順序不能作為參照;
thread相關 讀寫鎖
讀寫鎖初始化 int pthread rwlock init pthread rwlock t rwlock,const pthread rwlockattr t attr 該函式第乙個引數為讀寫鎖指標,第二個引數為讀寫鎖屬性指標。函式按讀寫鎖屬性對讀寫鎖進行初始化。加讀鎖 int pthread ...
thread互斥測試
互斥鎖,是一種訊號量,常用來防止兩個程序或執行緒在同一時刻訪問相同的共享資源。可以保證以下三點 原子性 把乙個互斥量鎖定為乙個原子操作,這意味著作業系統 或pthread函式庫 保證了如果乙個執行緒 鎖定了乙個互斥量,沒有其他執行緒在同一時間可以成功鎖定這個互斥量。唯一性 如果乙個執行緒鎖定了乙個互...
7 2 互斥量(互斥鎖)的相關API
1 對於多執行緒的程式,訪問衝突與資料紊亂的問題是很常見的,解決的一種辦法是引入互斥鎖 mutex 獲得鎖的執行緒可以完成 讀 修改 寫 操作,然後釋放鎖給其他執行緒,沒有鎖的執行緒只能等待而不能訪問共享資料 互斥鎖的主要函式 1 pthread mutex init函式 初始化乙個互斥鎖 互斥量 ...