我可以使用std::shared_ptr来包装IOCP中的每个I/O数据吗
Can I use std::shared_ptr to wrap per I/O data in IOCP?
我正在开发一个使用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实例。我想知道,使用std::shared_ptr而不是原始指针来管理我的每个I/O数据会有什么问题吗?
因此,对于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);
干杯
除非您在某个地方有std::shared_ptr<IoRequest>
的活动实例,否则在完成处理程序收到它之前,您的IoRequest
将在发送例程结束时被释放。
相关文章:
- 为 Sql 服务器实现 odbc 包装器.将数据库数据读取为字符或要求驱动程序将数据转换为 C 类型
- C++-用与被包装数据相同的语法构造包装类
- 我应该使用多个角色还是一个角色,将实际属性推迟到将数据包装/公开为其属性的QObject
- pybind11:如何包装以 std::vector<double> 为参数以避免数据复制的 C++ 函数
- 在C 中解开包装数据包
- 在消息中包装数据的开销
- 如何将数据传递到引用包装器
- OpenGL GltexSubimage数据包装
- 将问题包装在堆数据结构中
- 用相同的数据c++包装/铸造类和结构,以实现外部api
- 我可以使用std::shared_ptr来包装IOCP中的每个I/O数据吗
- 如何在Swig中为非基元数据类型创建包装器
- 是否有可能制作一个函数包装器来运行注入的代码并返回与注入的函数相同的数据
- AMP的非矩形数据包装器
- 使用std::mem_fn为数据成员创建可调用包装
- 基元数据类型的包装器类
- 用SWIG包装第三方类/数据类型
- 在结构/类中包装数据的快速方法
- 包装数据的STD方法
- 用SWIG在c++ Python包装类中填充二进制数据的char*