面試題目:
有5個生產者線程,5個消費者線程,有一個它們公共訪問的資源,使用vector存儲了這些資源, 生產者用於生產資源,消費者用於消耗資源,消費者也會從容器中進行刪除動作。 當前的方案是使用一個互斥鎖對vector進行保護,生產者、消費者線程在訪問資源之前必須先獲得鎖。 但是,生產者、消費者的併發頻率非常高,鎖導致了效率低下,請給出提高效率的方案。
1)面試時相出來的想法:
用10個vector, 每個生產者使用固定的兩個,生產線程先向其中一個vector放數據,放滿後再向另一個放,然後,所有的消費者線程只從當前沒有正被操作的vector中取數據。
-- 只是提出了一個思路,interviewer說可以! 想法的重要性啊。
這種方案的有點應該是使得鎖的粒度更小了,有利於提高併發性。
2) 面試時相出來的想法:
爲生產者和消費者劃分時間片,兩者輪轉,以解決生產者和消費者之間的競爭。 --- 不行!被否!
3)其他想法:
更換數據結構,例如使用一個隊列,生產者線程向隊頭放,消費者從對尾取。--- 由此,想到c++併發編程書籍中提到的無鎖結構!經查閱,這是一種需要仔細學習的c++ 領域。
《C++ Concurrency in Action 2nd Edition》very good!