私は、examples/curl/curl_fuse.cppとlibcaf_core/test/stateful_actor.cppの下で、stateful_actorの使い方を読んだことがあります。 stateful_actor<State>
は、State struct
のフィールドを宣言することによって、俳優のいくつかの状態をバインドできるようです。それは非常に便利です。stateful_actorを理解する
同じ効果を得るために、状態をフィールドとして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; }
};
};
したがって、CounterStateのデストラクタは、アクタが終了すると呼び出されますか? –
mm。私は国家と俳優の行動の懸念を分けることがメンテナンスの方が良いと思います。 –
"したがって、CounterStateのデストラクタは、アクタが終了すると呼び出されますか?"はい。アクタはメールボックスを閉じ、終了するときにその状態を破棄します。また、必要に応じて終了メッセージや停止メッセージを表示します。それ以降の着信メッセージはすべて破棄され(同期メッセージのエラーメッセージが表示されます)、終了したアクタにリンクするとすぐに終了メッセージが表示されます。 – neverlord