私はwin32APIの使用に関しては初心者なので、ご容赦ください。
私は現在、Winsockを含むC ++プロジェクトに取り組んでいますが、コピーコンストラクターに関してイベントオブジェクトのHANDLEタイプを操作する適切な方法について混乱しています。
概要(コードは以下のとおりです):IOCPを使用してすべてをスケーラブルに保つために、複数の受け入れイベントをチェックするスレッドがあります。各ServerConnectionオブジェクトは、WSACreateEvent()によって作成された独自の受け入れイベントオブジェクト、関連する低レベルソケット、および関連する状態/変数を保持します。
私の質問は、「ビッグスリー」を実装しようとしているのですが、ハンドルを「コピー」する方法がよくわかりません。
DuplicateHandle()は新しいハンドルを作成しているように見えますが、同じオブジェクトを指していますが、ServerConnectionの「コピー」に関しては意味がありません(同じ状態の新しいオブジェクトが必要ですよね?)。
コピー代入演算子の使用に関しては、イベントオブジェクトHANDLEに対して何が行われるのかわかりません。
ServerConnection.h
class ServerConnection
{
public:
//...constructors, destructors, etc...
virtual HANDLE getAcceptEvent();
virtual void setAcceptEvent(HANDLE eventObj);
protected:
private:
HANDLE assocAcceptEvent;
//..other variables...
};
ServerConnection.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
}