C++無(wú)鎖數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)示例詳解
無(wú)鎖數(shù)據(jù)結(jié)構(gòu)
無(wú)鎖并非真正無(wú)鎖,正如零拷貝并非零次拷貝。
實(shí)現(xiàn)
多生產(chǎn)者多消費(fèi)者隊(duì)列
// 基于自旋鎖(或者CAS,原理相同,后者實(shí)現(xiàn)較為復(fù)雜)
// 通過(guò)atomic庫(kù)中atomic_flag類進(jìn)行實(shí)現(xiàn)自旋達(dá)到多生產(chǎn)者多消費(fèi)者同步。
#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)者單消費(fèi)者隊(duì)列
// 類似內(nèi)核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...
}
};測(cè)試
前提:
每次主線程十次循環(huán)建立100個(gè)線程訪問(wèn)隊(duì)列,即1k線程并發(fā)。取100次平均值。一共三個(gè)版本:互斥鎖單線程訪問(wèn)a、單生產(chǎn)者單消費(fèi)者b、多生產(chǎn)者多消費(fèi)者c。
| 場(chǎng)景 | 結(jié)果 |
|---|---|
| Push和Pop接口不工作 | a和b時(shí)間相仿;c是前二100倍 |
| Push和Pop接口處理一些簡(jiǎn)單工作 | a和b時(shí)間相仿;c是前二的10倍 |
| Push和Pop接口處理一些較耗時(shí)工作 | b最快;c其次,為b的2倍;a最慢,為b的7-8倍 |
總結(jié)
綜合來(lái)看:?jiǎn)紊a(chǎn)者單消費(fèi)者模型效率最優(yōu)(Linux內(nèi)核kfifo)。不過(guò)具體使用何種模型實(shí)現(xiàn)線程安全,要根據(jù)實(shí)際場(chǎng)景進(jìn)行選擇,并且多測(cè)試,才能夠達(dá)到最佳模型的選擇。此處仍有一點(diǎn)未提及:若要實(shí)現(xiàn)多線程并發(fā)訪問(wèn)數(shù)據(jù)結(jié)構(gòu),即單生產(chǎn)者單消費(fèi)者或者多生產(chǎn)者多消費(fèi)者,仍需要盡量避免共同數(shù)據(jù)的訪問(wèn)防止segment fault。
以上就是C++無(wú)鎖數(shù)據(jù)結(jié)構(gòu)的詳細(xì)內(nèi)容,更多關(guān)于C++無(wú)鎖數(shù)據(jù)結(jié)構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++ 函數(shù) strftime 和時(shí)間格式示例詳解
strftime 是 C/C++ 標(biāo)準(zhǔn)庫(kù)中用于格式化日期和時(shí)間的函數(shù),定義在 <ctime> 頭文件中,它將 tm 結(jié)構(gòu)體中的時(shí)間信息轉(zhuǎn)換為指定格式的字符串,是處理時(shí)間輸出的核心工具,這篇文章主要介紹了C++ 函數(shù) strftime和時(shí)間格式,需要的朋友可以參考下2025-06-06
C語(yǔ)言實(shí)現(xiàn)小貓釣魚(yú)游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)小貓釣魚(yú)游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
C語(yǔ)言?動(dòng)態(tài)內(nèi)存管理全面解析
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語(yǔ)言中動(dòng)態(tài)內(nèi)存的管理2022-02-02
C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
C語(yǔ)言詳細(xì)分析講解關(guān)鍵字goto與void的作用
我們?cè)贑語(yǔ)言中經(jīng)常會(huì)見(jiàn)到void,也會(huì)偶爾見(jiàn)到goto,那么C語(yǔ)言中既然有g(shù)oto,為什么我們?cè)诖a中見(jiàn)的很少呢?在以前很多的項(xiàng)目經(jīng)驗(yàn)中,我們得到這樣一條潛規(guī)則:一般項(xiàng)目都是禁用goto的,程序質(zhì)量與goto的出現(xiàn)次數(shù)成反比。自后也就造成了我們一般不會(huì)使用goto2022-04-04
基于C語(yǔ)言實(shí)現(xiàn)計(jì)算生辰八字五行的示例詳解
生辰八字,簡(jiǎn)稱八字,是指一個(gè)人出生時(shí)的干支歷日期;年月日時(shí)共四柱干支,每柱兩字,合共八個(gè)字。這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)計(jì)算生辰八字五行的示例代碼,需要的可以參考一下2023-03-03

