1.靜態分配互斥量 pthread_mutex_t mutex = pthread_mutex_initializer
2.動態分配互斥量 pthread_mutex_init(&mutex); & pthread_mutex_destory(&mutex);
//操作:
1.pthread_mutex_lock 加鎖
2.pthread_mutex_trylock 嘗試加鎖
3.pthread_mutex_unlock 解鎖
4.保證執行緒正常 / 異常推出時可以釋放互斥鎖
pthread_cleanup_push
pthread_cleamup_pop
//套路:
threadhandle()
main()
pthread_create(&tid[i], null, threadhandle, &mutex);
pthread_join(tid[i], null);
pthread_mutex_destory(&mutex);
}
執行緒掛起直到共享資料某些條件滿足
1.動態 pthread_cond_t
2.靜態
函式:條件等待 pthread_cond_wait(cond, mutex);
定時等待 pthread_cond_timedwait(cond, mutex, abstime);
單個啟用 pthread_cond_signal(cond);
全部啟用 pthread_cond_broadcast(cond);
一般互斥鎖與條件變數聯合使用
在加鎖中等待條件變數
執行緒1:
while(1)
mutex_unlock();
}執行緒2:
while (1)
do something...
mutex_unlock();
}
1.寫加鎖狀態,所有試圖加鎖的執行緒都會阻塞
2.讀加鎖狀態,讀加鎖可以訪問,寫模式的加鎖會阻塞
/火車票查詢與購買/
#include #include pthread_rwlock_t rwlock = pthread_rwlock_initializer;//靜態分配讀寫鎖
int count = 10000;
int put_cur = 0;
void* search(void* arg)
}void rollback(void* arg)
void* put(void* arg)
pthread_cleanup_pop(0);
}void* hacker(void* arg)
void* get(void* arg)
else
usleep(500000);
pthread_rwlock_unlock(&rwlock); }}
int main();
int i = 0;
pthread_setconcurrency(4);
for (i = 0; i<4; i++)
for (i = 0; i<4; i++)
}
互斥鎖只能由鎖住的執行緒解鎖,訊號量不必等待統一執行緒的操作
乙個程序中訊號量的三種操作
1.建立(create)乙個訊號量,並指定初始值
2.等待(wait)乙個訊號量, <= 0阻塞; < 0就執行並減1
3.掛出(post)乙個訊號量,加一操作
//生產消費者模型
生產者—>[共享快取區]—>消費者
//生產者
get = 1;
put = 0;//初始化
while (1)
//消費者
while (1)
流程:
1.建立訊號量
有名訊號量:sem_open();//建立或開啟乙個訊號量
記憶體訊號量:sem_init();//
2.等待&掛出
sem_wait(); sem_trywait();//訊號量是0,不阻塞,直接返回錯誤標誌
sem_post(); sem_getvalue();//返回訊號量當前值
3.關閉
有名訊號量:
sem_close();//關閉
sem_unlink();//從系統刪除
記憶體訊號量:
sem_destory();
互斥鎖 自旋鎖 讀寫鎖 條件變數
互斥鎖 同一時刻只能有乙個執行緒進入臨界區,乙個執行緒獲取鎖如果失敗,則該執行緒進入睡眠狀態,同一執行緒多次加鎖會造成死鎖。使用場景 1.持鎖時間長 2臨界區競爭非常激烈 3 單核處理器 自旋鎖 不會造成執行緒進入睡眠狀態,執行緒會不斷檢測鎖是否已經釋放,減少了執行緒從睡眠到喚醒的核心開銷。使用場景...
同步執行緒 條件變數與互斥鎖
一。互斥量和條件變數簡介 互斥量 mutex 從本質上說是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成後釋放互斥量上的鎖。對互斥量進行加鎖以後,任何其他試圖再次對互斥鎖加鎖的執行緒將會阻塞直到當前執行緒釋放該互斥鎖。如果釋放互斥鎖時有多個執行緒阻塞,所有在該互斥鎖上的阻塞執行緒都會變成可執行...
執行緒同步 互斥鎖 條件變數
在 執行緒同步 互斥鎖 一文中,我們分析了只用互斥鎖同步執行緒的弊端 cpu的效率和時效性不可兼得。下面,我們通過使用條件變數,在保證cpu效率的前提下,提高程式的時效性。只用互斥鎖同步執行緒,其cpu佔用率之所以高,是因為執行緒需要輪詢,即需要不停的檢查條件是否滿足。我們使用條件變數,當條件不滿足...