#ifndef URL_QUEUE_H
#define URL_QUEUE_H
#include<windows.h
class UrlQueue
{
public:
static UrlQueue *GetInstance()
{
static UrlQueue urlQueue;//在此定义静态对象
return &urlQueue;
}
UrlQueue(int maxsize=1000)
{ // Initialize the list header to a MEMORY_ALLOCATION_ALIGNMENT boundary.
pListHead = (PSLIST_HEADER)_aligned_malloc(sizeof(SLIST_HEADER),
MEMORY_ALLOCATION_ALIGNMENT);
if( NULL == pListHead )
{
printf("Memory allocation failed.\n");
return;
}
InitializeSListHead(pListHead);
}
~UrlQueue()
{
_aligned_free(pListHead);
}
void Push(const char *val)//向队尾插入元素
{
int num = QueryDepthSList(pListHead);
while(num>=1000)
{
num = QueryDepthSList(pListHead);
if(num<1000) break;;
}
pProgramItem = (PPROGRAM_ITEM)_aligned_malloc(sizeof(PROGRAM_ITEM),MEMORY_ALLOCATION_ALIGNMENT);
if( NULL == pProgramItem )
{
printf("Memory allocation failed.\n");
return ;
}
pProgramItem->url = val;
pFirstEntry = InterlockedPushEntrySList(pListHead,
&(pProgramItem->ItemEntry));
}
void Pop(const char ** url)//从堆头删除元素
{
pListEntry = InterlockedPopEntrySList(pListHead);
if( NULL == pListEntry )
{
printf("List is empty.\n");
return ;
}
pProgramItem = (PPROGRAM_ITEM)pListEntry;
*url = pProgramItem->url;
_aligned_free(pListEntry);
}
private:
typedef struct _PROGRAM_ITEM
{
SLIST_ENTRY ItemEntry;
const char* url;
} PROGRAM_ITEM, *PPROGRAM_ITEM;
PSLIST_ENTRY pFirstEntry, pListEntry;
PSLIST_HEADER pListHead;
PPROGRAM_ITEM pProgramItem;
};
//------------------------------------------------
//------------------------------------------------
#endif
在windows用原子操作实现消息队列
最新推荐文章于 2024-09-23 22:07:01 发布