我是使用win32 API的新手,所以请多多包涵。
我目前正在处理一个涉及 Winsock 的 C++ 项目,但我对使用事件对象 HANDLE 类型的复制构造函数的正确方法感到困惑。
概述(代码如下):在尝试使用 IOCP 并保持一切可扩展性时,我有一个线程来检查多个接受事件。每个 ServerConnection 对象都拥有自己的由 WSACreateEvent() 创建的接受事件对象、其关联的低级套接字和相关的状态/变量。
我的问题是,我试图实现“三巨头”,但我不太确定应该如何“复制”句柄。
DuplicateHandle() 似乎创建了一个新句柄,但它指向同一个对象,但这对于 ServerConnection “副本”而言没有意义(我们想要一个具有相同状态的新对象,对吧?)。
至于使用复制赋值运算符,我不确定它会对事件对象 HANDLE 做什么。
服务器连接.h
class ServerConnection
{
public:
//...constructors, destructors, etc...
virtual HANDLE getAcceptEvent();
virtual void setAcceptEvent(HANDLE eventObj);
protected:
private:
HANDLE assocAcceptEvent;
//..other variables...
};
服务器连接.cpp
ServerConnection::ServerConnection(ServerConnection &that)
{
//blah blah...other vars
//? This does not seem right as the HANDLE is logically a pointer;
//Assigning like this just points another handle to the same event obj
//If the other ServerConnection object closes the handle...not good.
this.assocAcceptEvent = that.assocAcceptEvent;
//The only thing that make slightly more sense, is just to create a whole new one
//if I answered my own question, then great...but I wanted to make sure
this.assocAcceptEvent = WSACreateEvent();
//assume check for WSACreateEvent failing with WSAGetLastError() and
//handle appropriately
}