Nó không thực sự là một vấn đề của khóa, đó là về những gì các tài liệu tham khảo có nghĩa là:
TVar
là một tài liệu tham khảo có thể thay đổi trong phạm vi STM
, đại diện cho nhà nước chia sẻ chung. Bạn tạo nó giữ một giá trị, bạn có thể đọc và viết cho nó, vv Nó rất giống với IORef
hoặc STRef
(dù sao cũng giống nhau).
TMVar
là tham chiếu đến vùng mà chủ đề có thể sử dụng để liên lạc. Nó có thể được tạo bằng cách giữ một giá trị hoặc trống. Bạn có thể đặt một giá trị vào nó, mà nếu đã lấp đầy các khối cho đến khi một người khác làm trống nó; hoặc bạn có thể lấy một giá trị từ nó, mà nếu đã có các khối trống cho đến khi ai đó điền vào nó. Nó rõ ràng giống như một MVar
, nhưng đối với nhiều người sử dụng phổ biến nó có thể đơn giản hơn để nghĩ về nó như là một hàng đợi một phần tử được sử dụng cho một cặp sản xuất/người tiêu dùng giao tiếp.
Tóm lại, TVar
là trạng thái chung chung, sử dụng nếu bạn muốn cập nhật nguyên tử cho dữ liệu từ các vị trí tùy ý. TMVar
là một nguyên thủy đồng bộ hóa, sử dụng nó nếu bạn muốn một sợi để chờ đợi cho đến khi một cái gì đó trở nên có sẵn, trong khi chờ đợi một cái gì đó cần thiết.
Cũng lưu ý TChan
, được triển khai gần hai vị trí giữ TVar
s trong danh sách được liên kết trong đó mỗi liên kết chuyển tiếp cũng là TVar
và hoạt động như hàng đợi không liên kết để liên lạc.
Tất cả những thứ này có thể được sử dụng theo các cách hơi khác nhau, bạn có thể nhìn vào giá trị TMVar
mà không xóa nó, ví dụ, nếu bạn muốn một kịch bản có nhiều luồng chờ một tài nguyên trở thành có sẵn nhưng nó không bao giờ "sử dụng hết".
Nguồn
2011-08-02 16:20:59
Làm cách nào để 'thử lại 'gây deadlocks?Nó quay trở lại giao dịch hiện tại, sau đó khối cho đến khi tình hình thay đổi bằng cách nào đó. Nó không (trên thực tế, không thể) chặn bên trong một giao dịch. –
Mặc dù nó sẽ không bế tắc ở giữa một giao dịch, người ta có thể tạo ra các giao dịch mà không bao giờ có thể thành công theo cách tương tự như cách deadlocks cổ điển được tạo ra, như hai giao dịch chờ kết quả của nhau. Nó không phải là ngay lập tức rõ ràng như thế nào này là khác nhau từ bế tắc trong thực tế. – Rotsor
Ah, phải. Tôi tin rằng thuật ngữ thực tế cho điều đó là đủ, "livelock". Đó là một loại đói tài nguyên nhiều hơn nó giống như một bế tắc, mặc dù. Trong khi deadlocks có thể dễ dàng kết quả từ việc sử dụng không liên quan của cùng một nguồn tài nguyên, tôi tin rằng bản chất lạc quan của STM làm cho livelocks không khả thi trừ khi có xung đột trực tiếp hoặc tranh luận tổng thể rất cao. –