C++無鎖數(shù)據(jù)結構實現(xiàn)示例詳解
無鎖數(shù)據(jù)結構
無鎖并非真正無鎖,正如零拷貝并非零次拷貝。
實現(xiàn)
多生產(chǎn)者多消費者隊列
// 基于自旋鎖(或者CAS,原理相同,后者實現(xiàn)較為復雜)
// 通過atomic庫中atomic_flag類進行實現(xiàn)自旋達到多生產(chǎn)者多消費者同步。
#include <iostream>
#include <atomic>
class Queue {
atomic_flag spin_push_flag = false, spin_pop_flag = false;
public:
void Push() {
// 自旋+上鎖
while (spin_push_flag.test_and_set())
;
// working...
// 解鎖
spin_push_flag.clear();
}
void Pop() {
// 自旋+上鎖
while (spin_pop_flag.test_and_set())
;
// working...
// 解鎖
spin_pop_flag.clear();
}
};單生產(chǎn)者單消費者隊列
// 類似內核kfifo
#include <iostream>
#include <mutex>
class Queue {
private:
mutex mutex_push, mutex_pop;
public:
void Push() {
lock_gurad<mutex> lck(mutex_push);
// working...
}
void Pop() {
lock_gurad<mutex> lck(mutex_pop);
// working...
}
};測試
前提:
每次主線程十次循環(huán)建立100個線程訪問隊列,即1k線程并發(fā)。取100次平均值。一共三個版本:互斥鎖單線程訪問a、單生產(chǎn)者單消費者b、多生產(chǎn)者多消費者c。
| 場景 | 結果 |
|---|---|
| Push和Pop接口不工作 | a和b時間相仿;c是前二100倍 |
| Push和Pop接口處理一些簡單工作 | a和b時間相仿;c是前二的10倍 |
| Push和Pop接口處理一些較耗時工作 | b最快;c其次,為b的2倍;a最慢,為b的7-8倍 |
總結
綜合來看:單生產(chǎn)者單消費者模型效率最優(yōu)(Linux內核kfifo)。不過具體使用何種模型實現(xiàn)線程安全,要根據(jù)實際場景進行選擇,并且多測試,才能夠達到最佳模型的選擇。此處仍有一點未提及:若要實現(xiàn)多線程并發(fā)訪問數(shù)據(jù)結構,即單生產(chǎn)者單消費者或者多生產(chǎn)者多消費者,仍需要盡量避免共同數(shù)據(jù)的訪問防止segment fault。
以上就是C++無鎖數(shù)據(jù)結構的詳細內容,更多關于C++無鎖數(shù)據(jù)結構的資料請關注腳本之家其它相關文章!

