1

IOCP を使用するクライアント アプリケーションに取り組んでいます。

I/O ごとのデータ クラスは、WSAOVERLAPPED から派生しています。

class IoRequest : public WSAOVERLAPPED
{
...
};

非同期 I/O 操作を実行するときは、次のように使用します。

{ // WSASend - this is done in my main thread.
    IoRequest *pIoRequest = new IoRequest;
    pIoRequest->SetSocket(m_socket);
    pIoRequest->SetBuffer(vecCommandData);
    pIoRequest->SetOperationType(OP_TYPE_SEND);
    WSASend(m_socket, pIoRequest->GetWsaBuffer(), 1, NULL, 0, pIoRequest, NULL);
}

{ // WSARecv - this is done in my I/O worker thread.
    GetQueuedCompletionStatus(m_hIocp, &dwNumberOfBytesTransferred, &ulCompletionKey, (LPOVERLAPPED*)&pIoRequest, INFINITE);
    ...
    WSARecv(pIoRequest->GetSocket(), pIoRequest->GetWsaBuffer(), 1, NULL, &(pIoRequest->GetFlags()), pIoRequest, NULL);
    ...
}

IoRequest インスタンスをワーカー スレッド ルーチンで再利用します。I/O ごとのデータを管理するために生のポインタの代わりに std::shared_ptr を使用しても問題はありませんか?

したがって、WSASend() の場合は次のようになります。

std::shared_ptr<IoRequest> spIoRequest(new IoRequest);
spIoRequest->SetSocket(m_socket);
spIoRequest->SetBuffer(vecCommandData);
spIoRequest->SetOperationType(OP_TYPE_SEND);
WSASend(m_socket, spIoRequest->GetWsaBuffer(), 1, NULL, 0, spIoRequest.get(), NULL);

乾杯

4

1 に答える 1

1

std::shared_ptr<IoRequest>どこかのライブインスタンスがない限りIoRequest、完了ハンドラーが受信する前に、送信ルーチンの最後に割り当てが解除されます。

于 2012-08-06T21:49:56.110 に答える