//类
.h
#ifndef LOCK_FREE_QUEUE_H_
#define LOCK_FREE_QUEUE_H_
//不加锁队列,适合一个线程读取,一个线程写
#include <list>
using namespace std ;
template <typename T>
class CLockFreeQueue
{
public:
CLockFreeQueue()
{
list.push_back(T());//分割节点
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;*/
t = *iNext;
iHead = iNext;
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();
};
int GetSize()
{
return list.size();
};
private:
typedef std::list<T> TList;
TList list;
typename TList::iterator iHead, iTail;
};
#endif
.cpp
//队列使用
/****************声明队列***************/
CLockFreeQueue<CString> m_strQueue;
/**************队列插入元素***********/
m_strQueue.Produce("cs");
/*************声明线程****************/
AfxBeginThread(TestThread,0) ;
UINT TestThread(LPVOID param) { while(1) { while(!m_strQueue.IsEmpty()) { CString str; if ( m_strQueue.Consume(str) && !str.IsEmpty() ) {
//str就是你插入的元素了 } } Sleep(1000); } return 0; }