Могу ли я использовать std::shared_ptr для переноса данных ввода-вывода в IOCP?

Я работаю над клиентским приложением, использующим IOCP.

Мой класс данных ввода-вывода получен из WSAOVERLAPPED:

class IoRequest : public WSAOVERLAPPED
{
...
};

И при выполнении асинхронных операций ввода-вывода я использую это так:

{ // 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 в своей процедуре рабочего потока. Интересно, не будет ли проблем с использованием 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);

Ваше здоровье


person jpen    schedule 06.08.2012    source источник


Ответы (1)


Если у вас нет живого экземпляра std::shared_ptr<IoRequest>, ваш IoRequest будет освобожден в конце процедуры отправки до того, как обработчик завершения получит его.

person Nikolai Fetissov    schedule 06.08.2012
comment
@Remy, спасибо за вклад, но я предпочитаю редактировать свои ответы самостоятельно. Это освобождение может произойти прямо в середине обратного вызова получения, насколько нам известно. - person Nikolai Fetissov; 07.08.2012