2010-08-19 32 views

Trả lời

17

trong Erlang đơn vị trạng thái thực thi không phải là một luồng, mà là một quá trình. vâng, đó là một loại quá trình nhẹ được thực hiện trên đầu đề; nhưng nó giống như một quá trình hơn là một luồng.

Điểm chính là quy trình không chia sẻ trạng thái, chúng truyền thông điệp; trong khi các chủ đề chia sẻ mọi thứ theo mặc định và phải phân xử để tránh sự hỗn loạn.

do đó, bạn không cần an toàn chỉ vì bạn không làm việc với chủ đề.

+0

+1 chính xác ngay –

+2

Nhưng bạn cần "xử lý an toàn" :) –

1

Tuyên bố từ chối trách nhiệm: Tôi biết hầu như không có Erlang. Đưa ra ý kiến ​​của tôi với một hạt muối.

Một ngôn ngữ thuần túy chức năng (rõ ràng) chỉ cho phép các hàm "thuần túy". Wiki nói rằng các hàm thuần túy luôn an toàn cho luồng, do đó xác nhận cảm giác ruột của tôi về chủ đề đó.

Nhưng tôi không biết liệu Erlang có hoàn toàn hoạt động hay không (wiki ngụ ý khác, vì vậy tôi đoán là không). Có lẽ nó sử dụng các phương tiện khác để đạt được an toàn luồng. Dù sao, cấu trúc dữ liệu của nó là (chủ yếu là? Độc quyền?) Bất biến, và do đó vốn thread-an toàn. Và là một ngôn ngữ chức năng, ít nhất là mã Erlang thành ngữ sẽ không sử dụng các biến toàn cầu (muc? Any?) Nhưng sử dụng các hàm thuần túy thay thế. Đó là những chủ đề an toàn. Nhưng mọi thứ I/O vẫn có thể là một vấn đề ... nếu một chương trình Erlang đọc và ghi một tập tin đồng thời, mã đó không chắc chắn là không an toàn. Nhưng hầu hết thời gian, bạn sẽ được tốt nhờ vào cấu trúc dữ liệu bất biến và như vậy.

5

Javier đúng.

Tuy nhiên, tôi chỉ muốn thêm một cái gì đó như nó đã bắt gặp tôi trước đây. Nếu bạn đang làm việc với trình điều khiển tích hợp hoặc nif, nó có thể không còn là chủ đề an toàn nữa. Có vẻ như rõ ràng kể từ khi trình điều khiển hoặc nif sẽ được sử dụng mã C hoặc C + +, nhưng nó đáng nói đến. Vì vậy, bạn không thể bỏ qua hoàn toàn chủ đề an toàn chỉ vì bạn đang sử dụng Erlang.

3

No. Xem Erlang Style Actors Are All About Locking. Nó dễ dàng hơn nhiều để đạt được an toàn luồng trong một ngôn ngữ chức năng, nhưng bạn cần phải suy nghĩ về nó.

Tôi vừa mới bắt đầu tìm hiểu về an toàn luồng. Điều này làm tôi mã hóa nhiều hơn, có lẽ quá phòng thủ.

Lưu ý rằng trong trường hợp đó, rất có thể bạn vẫn gặp phải sự cố. Đồng bộ hóa mọi thứ được chia sẻ là rất khó để có được ngay trong bất kỳ điều gì ngoại trừ các ví dụ nhỏ nhất.

+0

Bài viết thú vị, nhưng tôi không nghĩ "an toàn chỉ" có nghĩa là khóa chết tự do. Trong thế giới Java/C#, nó thường có nghĩa là một đối tượng được bảo vệ chống lại các cập nhật đồng thời và có thể được sử dụng trong môi trường đa luồng một cách an toàn. Tài liệu tham khảo của OP về lập trình phòng thủ cho thấy cùng một quan điểm. – dsmith

+2

Nhưng bạn là chính xác. Các lập trình viên Erlang mới không thể bỏ qua khả năng của khóa chết. Nhưng điều thú vị về bài viết là nó vượt trội đến một cách để "phá vỡ" một khóa chết mà không dừng VM. Bạn mở một vỏ Erlang và đẩy một thông điệp vào quá trình khóa. – dsmith

2

Không, bạn vẫn cần phải xem xét an toàn luồng trong Erlang, nhưng các vấn đề đơn giản hơn nhiều để giải quyết.

Tôi đã đọc an article, trong đó tác giả đã chỉ ra rằng API tin nhắn của bạn có thể gây ra vấn đề về luồng. Ví dụ xoay quanh một tài khoản ngân hàng. API tin nhắn ban đầu của anh ta có các hoạt động GET và SET. Một số mã muốn gửi $ 100 sẽ nhận giá trị hiện tại, thêm 100 vào nó, và sau đó SET kết quả. Tất nhiên, điều này chỉ hoạt động nếu một quá trình duy nhất được truy cập vào tài khoản ngân hàng. Khi hai quy trình đang thao tác số dư, tất cả các cược sẽ bị tắt.

giải pháp của ông là thay đổi API nhắn gửi và rút (ông thực sự sử dụng một thông điệp - CẬP NHẬT - nhưng bạn sẽ có được ý tưởng). Điều này làm cho tương tác giả định ngữ nghĩa nguyên tử - quá trình lắng nghe sẽ chỉ xử lý một lần nạp tiền hoặc rút tiền tại một thời điểm và sẽ chặn các yêu cầu khác cho đến khi yêu cầu đầu tiên hoàn tất.

Nó đáng chú ý rằng vấn đề này là cơ bản giống như các vấn đề chia sẻ bộ nhớ. (Nếu chúng ta sử dụng các thông điệp GET và SET để tương tác với một tiến trình, chúng ta đã tạo ra một số bộ nhớ dùng chung). Một blogger khác là compares ets to shared memory. Tuy nhiên, miễn là bạn hiểu nơi bạn đã giới thiệu các cấu trúc giống như bộ nhớ chia sẻ và điều chỉnh quyền truy cập vào bộ nhớ chia sẻ đó, bạn không nên có bất kỳ vấn đề luồng nào (ngoài khóa bế tắc, dĩ nhiên).

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