資源簡介
基本想法:
方法1:
1、使用默認緩存5M
2、默認線程使用的內存為128K,即最多默認支持40個線程
3、初始化申請一塊5M內存,然后進行分割,線程使用的定義為GROUP,沒一條日志使用的為ITEM
4、運行過程中進行動態管理,內存用完后申請新的空間,一次為5M
5、線程使用完一個group后可以在使用其他的group,且不限在相同的原子buffer。
可能的問題在于,多次申請的問題,經過測試基本可以用。
方法2:
1、使用默認緩存5M
2、默認線程使用的內存為128K,即最多默認支持40個線程
3、初始化申請一塊5M內存,然后進行分割,線程使用的定義為GROUP,沒一條日志使用的為ITEM
4、運行過程中進行動態管理,內存用完后丟失
5、線程使用完一個group后可以在使用其他的group,且不限在相同的原子buffer。
可能的問題在于支持的線程是有上線的。
歡迎你的建議。

代碼片段和文件信息
#include?
#include?
#include?
#include?“NonLockingBuffer.h“
#define??PORT_NUMBER?9998
#define?GROUP_ITEM_COUNT?128
#define?THREAD_RUN_LOOP_TIMES?60
#define?MAX_THREAD_COUNT_NUMBER?40
class?CThreadTime
{
public:????
????void????BeginGetElapsedTime();
????__int64?EndGetElapsedTime();
private:
????__int64?FileTimeToQuadWord(PFILETIME?pft);
private:
????FILETIME?ftKernelTimeStart;
????FILETIME?ftKernelTimeEnd;
????FILETIME?ftUserTimeStart;
????FILETIME?ftUserTimeEnd;
????FILETIME?ftDummy;
};
//?Get?the?time?elapsed?since?the?thread?start
inline?void?CThreadTime::BeginGetElapsedTime()
{
????GetThreadTimes(GetCurrentThread()?&ftDummy?&ftDummy?&ftKernelTimeStart?&ftUserTimeStart);
}
//?Calculate?the?time?elapsed?
inline?__int64?CThreadTime::EndGetElapsedTime()
{
????GetThreadTimes(GetCurrentThread()?&ftDummy?&ftDummy?&ftKernelTimeEnd?&ftUserTimeEnd);
????__int64?qwKernelTimeElapsed?=?FileTimeToQuadWord(&ftKernelTimeEnd)?-?FileTimeToQuadWord(&ftKernelTimeStart);
????__int64?qwUserTimeElapsed?=?FileTimeToQuadWord(&ftUserTimeEnd)?-?FileTimeToQuadWord(&ftUserTimeStart);
????//?Get?total?time?duration?by?adding?the?kernel?and?user?times.
????//?the?default?is?100ns?so?we?convert?it?to?ms
????//return?(qwKernelTimeElapsed?+?qwUserTimeElapsed)?/?10000;
????return?(qwKernelTimeElapsed?+?qwUserTimeElapsed)?/?10;
}
inline?__int64?CThreadTime::FileTimeToQuadWord(PFILETIME?pft)?
{
????return?(Int64ShllMod32(pft->dwHighDateTime?32)?|?pft->dwLowDateTime);
}
class?CStopwatch?
{
public:
????CStopwatch()?
????{?
????????QueryPerformanceFrequency(&m_liPerfFreq);
????????Start();
????}
????void?Start()?
????{?
????????QueryPerformanceCounter(&m_liPerfStart);
????}
????__int64?Now()?const?
????{
????????//Returns?#?of?milliseconds?since
????????//Start?was?called
????????LARGE_INTEGER?liPerfNow;
????????QueryPerformanceCounter(&liPerfNow);
????????return?(((liPerfNow.QuadPart?-?
????????????m_liPerfStart.QuadPart)?*?1000)/
????????????m_liPerfFreq.QuadPart);
????}
private:
????//Counts?per?second
????LARGE_INTEGER?m_liPerfFreq;???
????//Starting?count
????LARGE_INTEGER?m_liPerfStart;??
};
//?2
//CThreadTime?ElapsedTime;
//ElapsedTime.BeginGetElapsedTime();
//?4
//CStopwatch?spWatch;
//?do?................
//2
//int?iElapse?=?ElapsedTime.EndGetElapsedTime();
//4
//__int64?iElapse?=?spWatch.Now();
class?WriteLogToFile
{
public:
????WriteLogToFile()
????????:?outfile(“d:\\log\\log.txt“?std::ofstream::binary?|?std::ofstream::app)
????{
????}
????virtual?void?Handle(Item*?entry)
????{
????????outfile.write?(entry->GetItemPointer()?entry->GetDataLen());
????????outfile.flush();
????????entry->SetDataSign(false);
????????//printf(“entry?size?%d\n“entry->Size());
????}
????~WriteLogToFile()
????{
????????outfile.close();
????}
private:
????std::ofstream?outfile;
};
class?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????2422??2013-12-25?14:00??Common.h
?????文件???????12743??2013-12-25?16:11??NonLockingBuffer.cpp
?????文件???????13666??2013-12-25?14:46??NonLockingBuffer.h
?????文件????????4128??2013-12-23?11:21??NonLockingBuffer.vcproj
?????文件????????1369??2013-12-23?10:32??SpinLock?-?副本.h
- 上一篇:rbf神經網絡c語言編程
- 下一篇:QtQuick實現的涂鴉板
評論
共有 條評論