2015-12-21 21 views
5

Tôi đã đọc một số cách sử dụng stateful_actor theo examples/curl/curl_fuse.cpplibcaf_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; } 
    }; 
}; 

Trả lời

5

Chúng ta có thể khai báo các quốc gia như trường trong class-based actor để có được những tác động giống nhau 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)?

Thời gian chạy CAF giả định các diễn viên bị cách ly, tức là chỉ một diễn viên được phép truy cập trạng thái của nó. Do đó, truy cập vào trạng thái của một diễn viên không bao giờ được đồng bộ hóa. Giao tiếp giữa các diễn viên sử dụng thông điệp đi qua, do đó tránh các điều kiện chủng tộc theo thiết kế.

Tác nhân có trạng thái cho phép người lập trình viết ít lớp hơn (và do đó ít mã soạn sẵn), nhưng cũng có một khác biệt đáng chú ý giữa ClassCounterStatefulCounter: tuổi thọ của biến. Trong ClassCounter, biến thành viên i sống cho đến khi hàm hủy của ClassCounter được gọi. Vì các tác nhân được tính tham chiếu, trình phá hủy sẽ chạy nếu không có tham chiếu đến nó, nghĩa là không có actor hoặc actor_addr xử lý cho tác nhân tồn tại. Trong StatefulCounter, thành viên CounterState được xây dựng nếu tác nhân được khởi tạo và hủy nếu nó chấm dứt.

Trạng thái chỉ tồn tại miễn là diễn viên còn sống. Điều này đặc biệt hữu ích cho việc phá vỡ chu kỳ. Nếu bạn có hai diễn viên AB, bạn có chu kỳ nếu A giữ tham chiếu đến B qua biến thành viên và ngược lại. Sử dụng diễn viên nhà nước thay vì phá vỡ chu kỳ này. A sẽ tự động phát hành tham chiếu đến B khi thoát và ngược lại.

+0

Vì vậy, trình hủy của CounterState sẽ được gọi khi diễn viên chấm dứt? –

+0

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ì. –

+1

"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

Các vấn đề liên quan