2012-06-28 25 views
6

Với Clojure (và các phương ngữ Lisp khác) bạn có thể sửa đổi mã đang chạy. Vì vậy, khi một hàm được sửa đổi trong thời gian chạy là thay đổi có sẵn cho nhiều luồng không?Các chức năng được sửa đổi như thế nào tại thời gian chạy sau đó được truyền cho nhiều luồng?

Tôi đang cố gắng tìm ra cách thức hoạt động về mặt kỹ thuật trong một khung cảnh đồng thời: nếu một số đề đang sử dụng một hàm foo, những gì xảy ra khi tôi xác định lại (nói bằng defn) chức năng foo?

Có một số việc đồng bộ hóa đang diễn ra: khi nào và làm thế nào để đồng bộ hóa như vậy xảy ra và chi phí là bao nhiêu?

Nói trên JVM, là hàm được tham chiếu sử dụng tham chiếu volatile? Nếu vậy, có nghĩa là mỗi lần có một "tra cứu chức năng" thì một người phải trả chi phí volatile?

Trả lời

8

Trong chức năng Clojure là các phiên bản của lớp IFn và chúng are almost always stored in vars. vars là cơ chế Clojures cho giá trị địa phương của chủ đề.

  • khi bạn định nghĩa một hàm thiết lập của var để tham khảo các chức năng
  • đề đề khác có được bất cứ điều gì các giá trị hiện tại của rễ ràng buộc cho var nhưng không thể thay đổi "ràng buộc gốc" giá trị. điều này ngăn cản bất kỳ hai chủ đề từ phải chiến đấu trên giá trị của var vì chỉ có chủ đề gốc có thể thiết lập giá trị.
  • chủ đề có thể chọn sử dụng giá trị mới của var nếu cần, nhưng gọi số binding, sau đó cung cấp cho riêng mình giá trị địa phương chủ đề mà họ có thể tự do thay đổi vì không có chủ đề nào khác có thể đọc nó.

Hiểu rõ về vars cũng đáng để nghiên cứu một chút, chúng là một thiết bị đồng thời rất hữu ích khi bạn quen với chúng.

ps: chuỗi gốc thường là REPL pss: bạn hoàn toàn có thể lưu trữ các chức năng của mình trong một thứ khác với vars, ví dụ bạn cần cập nhật nguyên tử một nhóm chức năng, mặc dù điều này hiếm.

+0

+1 và cảm ơn vì luôn hữu ích về Clojure (và các chủ đề khác;) Điểm đầu tiên của bạn là một câu hay hai điểm đầu tiên được hợp nhất với nhau trong một đoạn? Tôi nghĩ bạn có ý định viết một cái gì đó hơi khác một chút:) –

+0

Tôi dự định học tất cả, nhưng con đường thì khá dài;) –

+0

@cedric Martin, tôi sẽ cho người khác vượt qua mặc dù máy ngữ pháp ... ;-) –

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