具有Reset功能的多线程同步队列 - 1

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

具有Reset功能的多线程同步队列

前一段时间写了一个多线程同步队列,并且加入了Reset功能。可以保证线程读到的不会是不可识别的数据。自己自测过,不过还是不能保证没有bug:)

// -------------------------头文件:ThreadSafeQueue.h---------------------------//

#include <wtypes.h>

typedef struct _MsgItem // 8 bytes size

{

USHORT MsgID;

USHORT wParam; // 2 bytes

ULONG lParam; // 4 bytes

} MsgItem;

class CTreadSafeMsgQueue

{

private:

// 同步

int m_HeaderToWrite;

int m_TailToRead;

HANDLE m_S_Producer;

HANDLE m_S_Consumer;

HANDLE m_E_Queue;

// 初始化

BOOL m_bInitedOK;

// Reset

int m_WritingThreadNum; // 当前正在调用PostMsg,且已进入同步操作状态的线程数目

int m_ReadingThreadNum; // 当前正在调用GettMsg,且已进入同步操作状态的线程数目

BOOL m_bStop; // 正在Reset

// 消息缓冲区

int MAX_QUE_SIZE;

MsgItem *m_Queue;

// 非法消息类型

USHORT INVALID_MSG_TYPE;

// 常数

typedef enum { SLEEP_TIME = 20 };

public:

CTreadSafeMsgQueue(int QueSize = 64, USHORT InvalidMsgType = 0xFFFF);

~CTreadSafeMsgQueue();

BOOL Reset();

BOOL GetMsg(MsgItem &Msg, int WaitTime);

BOOL PostMsg(const MsgItem Msg, int WaitTime);

private:

CTreadSafeMsgQueue(const CTreadSafeMsgQueue*);

CTreadSafeMsgQueue(const CTreadSafeMsgQueue&);

const CTreadSafeMsgQueue& operator = (const CTreadSafeMsgQueue&);

};

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有  導航