c++ - CAF 中 stateful_actor 的初始状态
问题描述
我正在使用 CAF 为我最后一年的论文建模一个问题,我遇到了一个我认为没有记录的场景。在示例curl/curl_fuse.cpp
中,有状态的参与者curl_worker
定义和生成如下:
behavior curl_worker(stateful_actor<curl_state>* self, const actor& parent) {
return {
...
};
}
...
behavior curl_master(stateful_actor<master_state>* self) {
self->spawn<detached+linked>(curl_worker, self));
}
我认识到这种方法的目的是隔离演员的状态并防止循环引用,但是是否可以构造初始值curl_state
并在生成期间将其传递给演员?
我知道这可以通过基于类的演员来完成,但是由于上述参考问题,我想避免这些。
解决方案
是的,你可以传递任意参数来spawn
初始化你的演员,就像在这个例子中一样:
struct my_state {
int value;
};
behavior my_actor(stateful_actor<my_state>* self, my_state ms) {
self->state = std::move(ms);
// ...
}
void caf_main(actor_system& sys) {
auto hdl = sys.spawn(my_actor, my_state{42});
// ...
}
但是,CURL 示例self
在状态中存储了一个指针。这变得很棘手,因为在这种情况下,您无法在生成 actor 之前初始化状态。您可以做的最好的事情是在构造函数之外设置指针。
请记住,无论如何,您都需要为状态提供默认构造函数,因为 CAF在进入之前my_actor
创建状态。您当然可以立即覆盖它,但 CAF 仍然需要最初构造状态。
推荐阅读
- python - 使用 Python Selenium whataspp bot 隐藏 Chrome 窗口
- azure - 适用于数据湖的 Azure 数据治理解决方案方法
- javascript - 同一组件中的多个自定义反应钩子
- php - 在mysql查询中循环仅获取第一个结果
- firebase - 在 Firestore 上设置数据时将字符串转换为映射
- wordpress - 我有 wpdb Prepare 错误,我不知道如何修改它
- json - 如何使用 Powershell 修改 Json
- vba - TableDef 立即超出范围
- javascript - Nodejs GET REST API和频繁访问MongoDb数据库
- java - 启动Tomcat9服务器时DataSourceFactory的NoClassDefFoundError?