Tôi đã đọc một số cách sử dụng stateful_actor theo examples/curl/curl_fuse.cpp và libcaf_core/test/stateful_actor.cpp. Có vẻ như stateful_actor<State>
có thể ràng buộc một số trạng thái cho diễn viên bằng cách khai báo các trường trong State struct
. Nó rất hữu ích.Tìm hiểu về stateful_actor
Chúng tôi có thể khai báo các trạng thái là các trường trong class-based actor
để nhận các hiệu ứng tương tự không? Hoặc có một số xử lý đặc biệt trong số stateful_actor
(ví dụ: truy cập an toàn luồng)?
Các tác nhân trong ví dụ sau có cung cấp chức năng giống nhau không?
/* 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; }
};
};
Vì vậy, trình hủy của CounterState sẽ được gọi khi diễn viên chấm dứt? –
mm. Tôi nghĩ rằng tách các mối quan tâm của hành vi của Nhà nước và diễn viên là tốt hơn để bảo trì. –
"Vì vậy, destructor của CounterState sẽ được gọi khi diễn viên chấm dứt?" Vâng. Một diễn viên đóng hộp thư của nó và phá hủy trạng thái của nó khi chấm dứt. Nó cũng sẽ kích hoạt các thông báo thoát hoặc xuống khi cần thiết. Bất kỳ tin nhắn gửi đến nào khác sẽ bị xóa (kích hoạt thông báo lỗi cho tin nhắn đồng bộ) và liên kết đến một diễn viên đã kết thúc sẽ kích hoạt thông báo thoát ngay lập tức. – neverlord