生產者 - 消費者(producer-consumer),也叫有限緩衝(bounded-buffer),是多執行緒同步的經典問題之一。詳見 wikipedia。
**改寫自 boost.thread 自帶的示例(libs/thread/example/condition.cpp
),以「條件變數」實現同步。
#include #include #include #include #include
class boundedbuffer
void produce(int n) );
// 插入新的元素,更新下標。
circular_buffer_[end_] = n;
end_ = (end_ + 1) % circular_buffer_.size();
++buffered_;
} // 通知前,自動解鎖。
// 通知消費者。
not_empty_cv_.notify_one();
} int consume() );
// 移除乙個元素。
int n = circular_buffer_[begin_];
begin_ = (begin_ + 1) % circular_buffer_.size();
--buffered_;
// 通知前,手動解鎖。
lock.unlock();
// 通知生產者。
not_full_cv_.notify_one();
return n;
}private:
std::size_t begin_;
std::size_t end_;
std::size_t buffered_;
std::vectorcircular_buffer_;
std::condition_variable not_full_cv_;
std::condition_variable not_empty_cv_;
std::mutex mutex_;
};
生產者與消費者執行緒共享的緩衝。g_io_mutex
是用來同步輸出的。
boundedbuffer g_buffer(2);
boost::mutex g_io_mutex;
生產 100000 個元素,每 10000 個列印一次。
void producer()
++n;
} g_buffer.produce(-1);
}
每消費到 10000 的倍數,列印一次。
void consumer()
} while (n != -1); // -1 表示緩衝已達末尾。
// 往緩衝裡再放乙個 -1,這樣其他消費者才能結束。
g_buffer.produce(-1);
}
乙個生產者執行緒,三個消費者執行緒。
int main()
return 0;
}
輸出(括號中為執行緒 id):
produce: 0
consume: 0 (13c0)
produce: 10000
consume: 10000 (15fc)
produce: 20000
consume: 20000 (2558)
produce: 30000
consume: 30000 (13c0)
produce: 40000
consume: 40000 (15fc)
produce: 50000
consume: 50000 (13c0)
produce: 60000
consume: 60000 (15fc)
produce: 70000
consume: 70000 (13c0)
produce: 80000
consume: 80000 (15fc)
produce: 90000
consume: 90000 (15fc)
考慮乙個生產者和乙個消費者的情形,假定緩衝的大小為 2,來看看三個成員變數如何變化。
buffered_ begin_ end_
初始 0 0 0
生產 1 0 1
消費 0 1 1
消費 等待 buffered_ > 0 ...
生產 1 1 0
...
參考: c 11生產者消費者
綜合運用 c 11 中的新的基礎設施 主要是多執行緒 鎖 條件變數 來闡述乙個經典問題 生產者消費者模型,並給出完整的解決方案。include include include include include include static const int kitemrepositorysize 1...
5 12 生產者和消費者
一 生產者和消費者之間的關係 1 生產者將生產出來的資訊不斷存入乙個區域內,消費者將資訊從該區域內不斷讀取出來 生產者錄入資訊 消費者讀取資訊 例 電影票 public class movie public void setname string name public string getinfo...
6 1 生產者 消費者問題
在多執行緒程式中,執行緒之間通常存在分工。在一種常見模式中,一些執行緒是生產者,一些是消費者。需要強制執行幾個同步約束才能使此系統正常工作 在緩衝區中新增或刪除專案時,緩衝區處於不一致狀態。因此,執行緒必須具有對緩衝區的獨佔訪問許可權。如果消費者執行緒在緩衝區為空時到達,則會阻塞,直到生產者新增新專...