Tránh đệ quy khi đọc / ghi đồng bộ một cổng?


108

Tất cả các hoạt động của cổng trong Rebol 3 là không đồng bộ. Cách duy nhất tôi có thể tìm để thực hiện giao tiếp đồng bộ là gọi điện wait.

Nhưng vấn đề với việc gọi wait trong trường hợp này là nó sẽ kiểm tra các sự kiện cho tất cả các cổng đang mở (ngay cả khi chúng không nằm trong khối cổng được chuyển để chờ). Sau đó, họ gọi các trình xử lý sự kiện phản hồi của họ, nhưng việc đọc / ghi có thể được thực hiện ở một trong các trình xử lý sự kiện đó. Điều đó có thể dẫn đến các cuộc gọi đệ quy "chờ".

Làm cách nào để giải quyết vấn đề này?


8
Trên thực tế, tôi không nghĩ có giải pháp cho vấn đề này trong việc triển khai R3 hiện tại, vì vậy tôi đã tiếp tục thêm sàng lọc "/ only" thành "chờ", với đó, nó sẽ chỉ đợi trên các cổng được cung cấp để "chờ" , và do đó tránh các cuộc gọi đệ quy. Xem yêu cầu kéo của tôi tại: github.com/rebol/rebol/pull/177
Shixin Zeng

1
Vì tò mò, tại sao bạn cần nó phải đồng bộ?
toadzky

1
Có rất nhiều tình huống mà việc viết mã bằng cổng đồng bộ dễ dàng hơn nhiều: giả sử bạn muốn gửi email với một cú nhấp chuột vào một nút và báo cáo nếu nó thành công hay thất bại. Sẽ dễ dàng hơn nhiều nếu bạn đợi nó hoàn thành trước khi làm bất cứ điều gì khác.
Shixin Zeng

1
bạn có nhất thiết phải sử dụng Rebol không?
Rivenfall

1
Đúng. Đây thực sự là một câu hỏi về Rebol 3 hơn là giao tiếp đồng bộ nói chung.
Shixin Zeng

Câu trả lời:


1

Tại sao bạn không tạo một loại chức năng "Bộ đệm" để nhận tất cả các thư từ các mục nhập đồng bộ và xử lý chúng dưới dạng FIFO (nhập trước, xuất trước)?

Bằng cách này, bạn có thể giữ các đặc tính Assync của các cổng của mình và xử lý chúng ở chế độ đồng bộ.


0

trong trường hợp chỉ có các sự kiện không đồng bộ và chúng tôi cần trả lời đồng bộ, hãy khởi động bộ hẹn giờ hoặc ngủ trong thời gian chờ, nếu bộ xử lý hoặc mục tiêu bắt buộc được đáp ứng thì hãy nói true, còn lại là sai và đảm bảo rằng sự kiện được hủy / đặt lại cho tương tự nếu quan trọng.


0

Tôi nghĩ rằng có 2 vấn đề thiết kế (có thể là nội tại của các công cụ / giải pháp trong tầm tay).

  1. Waitđang làm quá nhiều - it will check events for all open ports. Trong môi trường âm thanh, việc chờ đợi chỉ nên được thực hiện ở những nơi cần thiết: mỗi thiết bị, mỗi cổng, mỗi ổ cắm ... Việc tạo ra các phụ thuộc lẫn nhau không cần thiết giữa các tài nguyên được chia sẻ không thể kết thúc tốt đẹp - đặc biệt là khi biết rằng các tài nguyên được chia sẻ (ngay cả khi không có phụ thuộc giữa các bên) có thể tạo ra rất nhiều vấn đề.

  2. Các trình xử lý sự kiện có thể làm quá nhiều. Một trình xử lý sự kiện phải càng ngắn càng tốt và nó chỉ nên xử lý sự kiện. Nếu có nhiều hơn, thì trình xử lý đang làm quá nhiều - đặc biệt nếu liên quan đến các tài nguyên được chia sẻ khác. Trong nhiều tình huống, trình xử lý chỉ lưu dữ liệu sẽ bị mất nếu không; và một công việc không đồng bộ sẽ làm những việc phức tạp hơn.


-1

Bạn chỉ có thể sử dụng một ổ khóa. Cummunication1 có thể đặt một số trạng thái khóa toàn cục tức là với một biến (hãy chắc chắn rằng nó an toàn cho luồng). locked = true. Sau đó, Communication2 có thể đợi cho đến khi nó được mở khóa.

loop do
    sleep 10ms
    break if not locked
end
locked = true
handle_communication()

1
Đây thực sự là một câu hỏi về Rebol 3 hơn là giao tiếp đồng bộ nói chung.
Shixin Zeng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.