解析C++無鎖隊(duì)列的實(shí)現(xiàn)代碼
更新時間:2013年05月16日 15:44:08 作者:
本篇文章是對C++無鎖隊(duì)列的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
本文給出一種C++無鎖隊(duì)列的實(shí)現(xiàn)代碼,主要用于一個線程讀取數(shù)據(jù)另外一個線程寫數(shù)據(jù)
#ifndef LOCK_FREE_QUEUE_H_
#define LOCK_FREE_QUEUE_H_
//不加鎖隊(duì)列,適合一個線程讀取,一個線程寫
#include <list>
template <typename T>
class LockFreeQueue
{
public:
LockFreeQueue()
{
list.push_back(T());//分割節(jié)點(diǎn)
iHead = list.begin();
iTail = list.end();
};
void Produce(const T& t) //存消息
{
list.push_back(t);
iTail = list.end();
list.erase(list.begin(), iHead);
};
bool Consume(T& t) //取消息
{
typename TList::iterator iNext = iHead;
++iNext;
if (iNext != iTail)
{
iHead = iNext;
t = *iHead;
return true;
}
return false;
};
bool Peek(T& t) //查看消息不刪除
{
typename TList::iterator iNext = iHead;
++iNext;
if (iNext != iTail)
{
t = *iNext;
return true;
}
return false;
}
bool IsEmpty()
{
typename TList::iterator iNext = iHead;
++iNext;
if (iNext != iTail)
{
return false;
}
else
{
return true;
}
}
int GetMaxSize()
{
return list.max_size();
};
private:
typedef std::list<T> TList;
TList list;
typename TList::iterator iHead, iTail;
};
#endif
復(fù)制代碼 代碼如下:
#ifndef LOCK_FREE_QUEUE_H_
#define LOCK_FREE_QUEUE_H_
//不加鎖隊(duì)列,適合一個線程讀取,一個線程寫
#include <list>
template <typename T>
class LockFreeQueue
{
public:
LockFreeQueue()
{
list.push_back(T());//分割節(jié)點(diǎn)
iHead = list.begin();
iTail = list.end();
};
void Produce(const T& t) //存消息
{
list.push_back(t);
iTail = list.end();
list.erase(list.begin(), iHead);
};
bool Consume(T& t) //取消息
{
typename TList::iterator iNext = iHead;
++iNext;
if (iNext != iTail)
{
iHead = iNext;
t = *iHead;
return true;
}
return false;
};
bool Peek(T& t) //查看消息不刪除
{
typename TList::iterator iNext = iHead;
++iNext;
if (iNext != iTail)
{
t = *iNext;
return true;
}
return false;
}
bool IsEmpty()
{
typename TList::iterator iNext = iHead;
++iNext;
if (iNext != iTail)
{
return false;
}
else
{
return true;
}
}
int GetMaxSize()
{
return list.max_size();
};
private:
typedef std::list<T> TList;
TList list;
typename TList::iterator iHead, iTail;
};
#endif
相關(guān)文章
C/C++使用socket實(shí)現(xiàn)判斷ip是否能連通
這篇文章主要為大家詳細(xì)介紹了C/C++如何使用socket實(shí)現(xiàn)判斷ip是否能連通,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-07-07
OpenCV實(shí)現(xiàn)區(qū)域分割和區(qū)域生長
區(qū)域分割是圖像處理中一個重要的任務(wù),本文主要介紹了OpenCV實(shí)現(xiàn)區(qū)域分割和區(qū)域生長,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢
這篇文章主要為大家詳細(xì)介紹了cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
linux根據(jù)pid獲取進(jìn)程名和獲取進(jìn)程pid(c語言獲取pid)
status文件,第一行的Name即為進(jìn)程名,C程序?qū)崿F(xiàn)根據(jù)PID獲取進(jìn)程名和根據(jù)進(jìn)程名獲取PID,大家參考使用吧2013-12-12
C++報(bào)錯 XX does not name a type;
這篇文章主要給大家介紹了C++報(bào)錯 XX does not name a type;field `XX’ has incomplete type解決方案,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2023-08-08
C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制整數(shù)的方法
這篇文章主要介紹了C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制整數(shù)的方法,涉及C++字符串與數(shù)制轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07

