線程同步規則

併發編程兩種模型:
1. 消息通信
2. 共享內存編程

同步原則:
1. 減小共享對象,使用不可變對象
2. 使用高級併發組件
3. 只使用互斥與條件變量併發

互斥器

1.lock和unlock交給棧上的Guard對象的構造和析構負責
(保證在同一個函數同一個區域內加鎖解鎖)
2.看函數調用棧能分析加鎖狀況
3.不使用嵌套鎖
4.RAII封裝鎖
5.加鎖和解鎖在同一個線程函數

死鎖

  1. 兩個鎖,加鎖順序相反
  2. 嵌套調用重複加鎖

條件變量

條件變量首先要肯定條件,且條件惟一做爲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%的線程同步問題。
若是遭遇到哲學家那樣的問題,能夠使用一個管理線程去負責同步,而不要每一個線程做爲一個哲學家的策略。資源

相關文章
相關標籤/搜索