併發編程兩種模型:
1. 消息通信
2. 共享內存編程
同步原則:
1. 減小共享對象,使用不可變對象
2. 使用高級併發組件
3. 只使用互斥與條件變量併發
1.lock和unlock交給棧上的Guard對象的構造和析構負責
(保證在同一個函數同一個區域內加鎖解鎖)
2.看函數調用棧能分析加鎖狀況
3.不使用嵌套鎖
4.RAII封裝鎖
5.加鎖和解鎖在同一個線程函數
條件變量首先要肯定條件,且條件惟一做爲wait線程
1.wait端
必須與mutex一塊兒使用
必須已經上鎖
判斷條件必須使用while,且wait在while裏code
int dequeue() { MutexLockGuard lock(mutex); while(queue.empty()) { cond.wait(); } assert(!queue.empty()); int top = queue.front(); queue.pop_front(); return pop; }
2.broadcast端
不必定在上鎖狀況signal
在signal前必定要修改布爾表達式
修改布爾表達式必須上鎖對象
broadcast代表狀態變化,signal表示資源可用內存
void enqueue(int x) { MutexLockGuard lock(mutex); queque.push_back(x); cond.notify(); }
通常生產者和消費者的模型能夠解決80%的線程同步問題。
若是遭遇到哲學家那樣的問題,能夠使用一個管理線程去負責同步,而不要每一個線程做爲一個哲學家的策略。資源