首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解stateful_actor

理解stateful_actor
EN

Stack Overflow用户
提问于 2015-12-21 07:13:38
回答 1查看 362关注 0票数 5

我读过stateful_actor在fuse.cppactor.cpp下的一些用法。看起来,stateful_actor<State>可以通过在State struct中声明字段来为参与者绑定一些状态。它非常有用。

我们能否将状态声明为class-based actor中的字段以获得相同的效果?或者在stateful_actor中有一些特殊的处理(例如线程安全访问)?

下面的示例中的参与者是否提供了相同的功能?

代码语言:javascript
复制
/* 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; }
    };
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-21 21:01:58

我们能否将状态声明为class-based actor中的字段以获得相同的效果?或者在stateful_actor中有一些特殊的处理(例如线程安全访问)?

CAF的运行时假定参与者是孤立的,即只允许参与者本身访问其状态。因此,对参与者状态的访问永远不会同步。角色间通信使用消息传递,从而通过设计避免了竞争条件.

有状态的参与者允许程序员编写更少的类(从而减少样板代码),但是ClassCounterStatefulCounter之间也有一个显著的区别:变量的生存期。在ClassCounter中,成员变量i一直存在,直到调用ClassCounter的析构函数为止。由于参与者是引用计数的,所以如果没有对其的引用,即不存在对参与者的actoractor_addr句柄,则析构函数将运行。在StatefulCounter中,如果参与者被初始化并在其终止时销毁,则将构造CounterState成员。

只有当一个演员还活着的时候,国家才会存在。这对于打破循环特别有用。如果有两个参与者AB,那么如果A通过一个成员变量保存对B的引用,则有一个循环,反之亦然。相反,使用有状态的参与者可以打破这种循环。A将在退出时自动释放对B的引用,反之亦然。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34390574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档