在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