1

私は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
}
4

1 に答える 1

5

賢明な方法でハンドルをコピーできない (つまり、 が希望どおりにならない) という事実から、DuplicateHandleこのオブジェクトはコピー可能であってはならないと思います...

自問しなければならない質問は、ServerConnection のコピーが実際に何を意味するのかということです。どこで/どのように使用しますか?

あなたの全体的な設計が ServerConnection で何を意味するのかわからないため、答えはわかりませんが、ServerConnection と書かれているという事実は、それが何かに「接続されている」ものであると私に思わせます。簡単にはコピーできません。

于 2013-01-16T21:13:07.940 に答える