具有Reset功能的多线程同步队列 - 2
来源:互联网 发布:kit plumber软件下载 编辑:程序博客网 时间:2024/04/27 23:06
// ---------------------------------实现文件---------------------------------//
#include "threadsafequeue.h"
CTreadSafeMsgQueue::CTreadSafeMsgQueue(int QueSize, USHORT InvalidMsgType)
{
INVALID_MSG_TYPE = InvalidMsgType;
MAX_QUE_SIZE = QueSize;
m_Queue = NULL;
m_HeaderToWrite = 0;
m_TailToRead = 0;
m_S_Producer = NULL;
m_S_Consumer = NULL;
m_E_Queue = NULL;
m_WritingThreadNum = 0;
m_ReadingThreadNum = 0;
m_bStop = FALSE;
m_bInitedOK = TRUE; // 注意
if (QueSize > 0) m_Queue = new MsgItem [QueSize];
m_bInitedOK &= (m_Queue != NULL);
if (!m_bInitedOK) return;
m_S_Producer = CreateSemaphore(NULL, MAX_QUE_SIZE, MAX_QUE_SIZE, NULL);
m_bInitedOK &= (m_S_Producer != NULL);
if (!m_bInitedOK) return;
m_S_Consumer = CreateSemaphore(NULL, 0, MAX_QUE_SIZE, NULL);
m_bInitedOK &= (m_S_Consumer != NULL);
if (!m_bInitedOK) return;
m_E_Queue = CreateEvent(NULL, FALSE, TRUE, NULL);
m_bInitedOK &= (m_E_Queue != NULL);
}
CTreadSafeMsgQueue::~CTreadSafeMsgQueue()
{
// 防止新的线程进入
m_bInitedOK = FALSE;
while (m_bStop) Sleep(SLEEP_TIME);
// 等待至少一类线程(读线程或写线程)退出同步状态
while ((m_WritingThreadNum != 0) && (m_ReadingThreadNum != 0)) Sleep(SLEEP_TIME);
// 此时线程必定阻塞于信号量(Semaphore)状态
// 释放写线程
while (m_WritingThreadNum > 0)
{
// 必须Sleep以出让CPU控制权
ReleaseSemaphore(m_S_Producer, 1, NULL);
Sleep(5);
}
// 释放读线程
if (m_ReadingThreadNum > 0)
{
for (int i = 0; i < MAX_QUE_SIZE; i++)
{
// 将待读取消息类型置为非法类型
m_Queue[m_TailToRead].MsgID = INVALID_MSG_TYPE;
}
while (m_ReadingThreadNum > 0)
{
// 释放读线程
ReleaseSemaphore(m_S_Consumer, 1, NULL);
Sleep(5);
}
}
CloseHandle(m_S_Consumer);
CloseHandle(m_S_Producer);
CloseHandle(m_E_Queue);
delete [] m_Queue;
}
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 具有Reset功能的多线程同步队列 - 2
- JAVA写的多线程下载程序,并具有断点续传功能
- JAVA写的多线程下载程序,并具有断点续传功能
- 多线程同步队列实现
- 具有超时返回功能的状态机--计数器超时等效于同步复位功能
- 一个支持多线程同步循环队列的实现
- 具有edit功能的combobox
- 具有缓存功能的ServiceLocator
- 链表类具有哈希表的功能
- CMS应该具有的功能
- 具有edit功能的combobox
- 具有交互功能的对话框
- 具有buffer功能的RandomAccessFile
- 具有交互功能的对话框
- 具有记忆功能的数据结构
- 如何让DataList具有分页的功能 2(asp.net)
- 具有优先级的阻塞队列 PriorityBlockingQueue
- Windows Azure上取得更具有竞争力AWS,推出新的移动功能,网页缩放,数据同步等
- 2000之日志传送功能-描述(2)
- MFC类库之根基-CObject浅析
- 装MySQl后不能启动的解决办法
- 强制视频……我已经试过了
- 2000之日志传送功能-设定(1)
- 具有Reset功能的多线程同步队列 - 2
- 2000之日志传送功能-设定(2)
- 在VC中用CMenuXP使应用程序拥有Office XP风格的界面
- Makefile
- 逛家乐福程序
- 试用EF开发WEB应用程序(10): 配置Apache
- 很工作狂
- 2000之日志传送功能-设定(3)
- vc入门宝典十二(调用其它程序)