我面临以下问题:
我有一个RpcExecutor
班。此类:
我将所有内容保持异步(通过boost.asio)。每次发送请求时,都会调用写处理程序来修改映射:
async_write(...., [this, ...](error_code ec, size_t bytesTransferred) {
//
pendingRequests_.insert(requestId, move(myPromise));
};
我开始使用async_read_until
在同一个套接字中进行侦听,并且答复可能不正确。我还需要从此程序中修改pendingRequests_
:
async_read(... [this, ...](error_code ec, size_t bytesTransferred) {
...
pendingRequests_.at(requestId).set_value(...);
pendingRequests_.erase(requestId);
});
我的课看起来像这样:
class RpcExecutor {
private:
std::unique_ptr<std::map<std::uint64_t, MyPromise>> pendingRequests_;
...
};
为了确保pendingRequests_
的初始化,pendingRequests_
的读取和写入是通过同一线程完成的(我确实检查了这种情况),我有以下限制已应用:
asio::run()
线程,与RpcExecutor
实例不同。pendingRequests_
内初始化boost::asio::post(myIoContext, ...)
指向对象,这意味着它在执行asio::run
的同一线程中初始化。async_read
处理程序和async_write
处理程序在与io_context::run
相同的线程中执行,而该线程与boost::asio::post
相同。总共:
boost::asio::post
,async_read
处理程序和async_write
处理程序在同一线程中执行。RpcExecutor
类实例是在另一个线程中创建的。async_read
和async_write
处理程序看不到pendingRequests_
的相同内存地址。 map
类实例在另一个线程中,我应该如何初始化我的处理程序线程中可以使用的RpcExecutor
?即使我通过asio::context::run
在与post
相同的线程中初始化了指向元素,处理程序仍然看到该对象的不同地址。RpcExecutor
成员变量的pendingTasks_
类实例不是同一线程也是如此。答案 0 :(得分:0)
问题非常微妙:
我在代码的某些行中这样做:
executor_ = RpcExecutor(socket_);
然后创建RpcExecutor
,开始监听传入的消息,所有消息都在构造函数中。但是此后该对象被移至executor_
变量。
由于我的async_read
和async_read
处理程序正在捕获this
,并且this
在移动后不是同一地址,因此它们显示了不同的地址:
this
。this
地址。RpcExecutor
不可复制且不可移动。RpcExecutor::listenIncomingMessage
是个好主意。