在windows用原子操作实现消息队列

来源:互联网 发布:vc udp socket编程 编辑:程序博客网 时间:2024/05/16 09:02
#ifndef URL_QUEUE_H#define URL_QUEUE_H#include<windows.hclass 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