2011-08-02 47 views
42

Tôi đã thấy TVar là một thùng chứa đơn giản, trong khi TMVar giống với một MVar, có nghĩa là nó có khóa vv, nhưng trong đơn STM. Tôi tự hỏi tại sao điều đó lại cần thiết, vì ý tưởng của STM là làm cho ổ khóa không cần thiết.Sự khác nhau giữa TVar và TMVar

Vì vậy, đó là một trong những sử dụng nếu bạn, nói có một loại như [Handle] một danh sách các tay cầm ổ cắm mà bạn muốn sử dụng giữa các chủ đề được thực hiện bởi forkIO?

Trả lời

38

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".

19

Sự khác biệt giữa TVarTMVar không quá lớn khi chúng nhìn - chắc chắn không thể so sánh với sự khác biệt giữa IORefMVar.

Trong khi MVar thực sự cung cấp một số khóa để đảm bảo an toàn cho luồng, TMVar không có gì thú vị! (không có khóa bổ sung) Mọi thứ quan trọng đã được triển khai với STMTVar, vì vậy TMVar a chỉ là một cách ngắn gọn cho TVar (Maybe a) được trang bị một số chức năng đẹp (một số trong số đó sử dụng chức năng retry).

Cho dù chặn với retry tương thích với tinh thần STM và liệu nó loại bỏ một số lợi thế của STM (không có deadlocks, v.v.) là một câu hỏi riêng và tôi rất muốn thấy ai đó có kinh nghiệm hơn để trả lời.

+1

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

+6

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

+4

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

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