我读过stateful_actor在fuse.cpp和actor.cpp下的一些用法。看起来,stateful_actor<State>可以通过在State struct中声明字段来为参与者绑定一些状态。它非常有用。
我们能否将状态声明为class-based actor中的字段以获得相同的效果?或者在stateful_actor中有一些特殊的处理(例如线程安全访问)?
下面的示例中的参与者是否提供了相同的功能?
/* Class based actor */
struct ClassCounter : caf::event_based_actor
{
caf::behavior make_behavior() override {
return {
[=](inc_atom){ i += 1; }
, [=](ret_atom){ return i; }
};
}
const char* name() const override { return "I am class-based"; }
int i = 0;
};
/* Stateful actor */
struct CounterState
{
caf::local_actor* self;
int i = 0;
const char* name = "I am stateful";
};
caf::behavior StatefulCounter(caf::stateful_actor<CounterState>* self)
{
return {
[=](inc_atom){ self->state.i += 1; }
, [=](ret_atom){ return self->state.i; }
};
};发布于 2015-12-21 21:01:58
我们能否将状态声明为
class-based actor中的字段以获得相同的效果?或者在stateful_actor中有一些特殊的处理(例如线程安全访问)?
CAF的运行时假定参与者是孤立的,即只允许参与者本身访问其状态。因此,对参与者状态的访问永远不会同步。角色间通信使用消息传递,从而通过设计避免了竞争条件.
有状态的参与者允许程序员编写更少的类(从而减少样板代码),但是ClassCounter和StatefulCounter之间也有一个显著的区别:变量的生存期。在ClassCounter中,成员变量i一直存在,直到调用ClassCounter的析构函数为止。由于参与者是引用计数的,所以如果没有对其的引用,即不存在对参与者的actor或actor_addr句柄,则析构函数将运行。在StatefulCounter中,如果参与者被初始化并在其终止时销毁,则将构造CounterState成员。
只有当一个演员还活着的时候,国家才会存在。这对于打破循环特别有用。如果有两个参与者A和B,那么如果A通过一个成员变量保存对B的引用,则有一个循环,反之亦然。相反,使用有状态的参与者可以打破这种循环。A将在退出时自动释放对B的引用,反之亦然。
https://stackoverflow.com/questions/34390574
复制相似问题