2012-09-25 32 views
5

Tôi có mã C++ thực hiện giao thức đặc biệt qua cổng nối tiếp. Mã này là đa luồng và thăm dò nội bộ cổng nối tiếp và thực hiện xử lý tuần hoàn riêng của nó. Tôi muốn gọi trình điều khiển này từ erlang và cũng nhận được sự kiện từ trình điều khiển này. Mối quan tâm của tôi là mã C++ này đa luồng và cũng có nghĩa là khi tôi gọi một hàm nhất định trên trình điều khiển, nó lưu trữ nội bộ sẽ được sử dụng/yêu cầu trên các cuộc gọi tiếp theo của trình điều khiển. Câu hỏi của tôi làNIF để bọc mã C++ đa luồng của tôi

1.Không NIF chạy trong cùng một quá trình os khi phần còn lại của các trình xử lý erlang của tôi hoặc NIF được khởi chạy trong một quá trình os riêng biệt?

2.Không có ý nghĩa để làm cong mã C++ có trạng thái đa luồng này với NIF?

4.Nếu NIF không phải là cách tiếp cận đúng, cách tốt nhất để tôi làm cho Elrang nói chuyện qua lại với mã C++ này là gì. Tôi cũng thích mã C++ của tôi trong quá trình OS giống như phần còn lại của các quy trình Erlang và có vẻ như các trình điều khiển liên kết là một tùy chọn nhưng không chắc liệu bản chất đa luồng của mã C++ của tôi có ổn không mô hình. Cộng với tôi nghe họ có thể mess lên lịch trình elrang?

Trả lời

4
  1. Không giống như cổng, NIF được chạy trong quá trình Erlang VM, tương tự như trình điều khiển. Do đó, bất kỳ sự cố NIF nào cũng sẽ mang VM xuống. Và, trả lời trước, cho câu hỏi cuối cùng của bạn, NIF, giống như trình điều khiển, có thể chặn trình lên lịch của bạn.

  2. Điều đó phụ thuộc vào chức năng bạn đang triển khai bằng mã C++ này. Do câu trả lời 1), bạn có thể muốn tránh đồng thời trong phần C++, vì đó là một nguồn lỗi tiềm ẩn. Nó không phải luôn luôn có thể, tất nhiên. Nhưng nếu bạn đang thực hiện, nói rằng, một số công nhân bơi, đi trước và thực hiện mã 1-ren, sinh sản nó nhiều lần như bạn cần.

  3. Trình điều khiển có thể được đa luồng quá, với cùng một vấn đề tiềm năng và hiệu suất khá giống nhau (tốt, vẫn hơi nhanh hơn NIF). Nếu bạn không hoàn toàn chắc chắn về sự ổn định mã C++ của bạn, hãy sử dụng nó như một cổng Erlang.

Nói về sự khác biệt giữa NIFs và trình điều khiển, trước đây là đồng bộ tự nhiên, và sau này có thể không đồng bộ (có thể thực sự là một lợi thế rất lớn nếu bạn không muốn nhận bất cứ câu trả lời cho hầu hết các lệnh). Trình điều khiển được dễ dàng hơn để mess và khó khăn hơn để thực hiện (nhưng một khi bạn nắm bắt được các mô hình chính và các vấn đề, họ có vẻ không sao, thực sự).

Dưới đây là một khởi đầu tốt cho tài xế: http://www.erlang.org/doc/apps/erts/driver.html

Và một cái gì đó tương tự (chiêm ngưỡng sự khác biệt về độ phức tạp) cho NIFs: http://www.erlang.org/doc/tutorial/nif.html

+0

Cảm ơn bạn đã trả lời. Vấn đề là tôi không thể thay đổi mã C++ và nó trong nội bộ tạo ra một số chủ đề giới hạn. Thêm vào đó nó có khóa trên một số cấu trúc dữ liệu nội bộ của nó, nơi các cuộc gọi nif sẽ có thể truy cập và do đó cuộc gọi nif có thể chặn cho đến khi luồng nội bộ giải phóng khóa. Đó có phải là ok giả sử mã c + + là lỗi miễn phí? Ngoài ra, có vẻ với tôi rằng tất cả các quá trình Erlang chạy trên chỉ có một chủ đề (tôi chỉ có một lõi) và vm không sử dụng bất kỳ hồ bơi thread? Thê nay đung không? Nếu vậy làm thế nào để chúng ta có được đồng thời trong Erlang như chúng ta không bao giờ biết bao lâu mỗi quá trình erlang có thể mất? – iCode

+2

Nếu bạn muốn nhận được hành vi không đồng bộ mà bạn nói về bạn nên sử dụng http://www.erlang.org/doc/man/erl_nif.html#enif_thread_create để tạo một chuỗi mà sau đó bạn thực thi mã C++ của mình. Bạn sử dụng một đường ống hoặc somesuch để giao tiếp với chủ đề đó và sử dụng enif_send_term để gửi lại kết quả.Thực hiện một trình điều khiển có thể bộ bạn tốt hơn như bạn sau đó có thể sử dụng được xây dựng trong hồ bơi thread async erlang để bạn C++ hoạt động. Trình điều khiển cũng có xu hướng linh hoạt hơn khi chạy trong trình giả lập không phải smp (không giống với smp: 1: 1). – Lukas

+0

Số lượng chủ đề trong Erlang không ảnh hưởng nhiều đến đồng thời. Trình lên lịch VM chỉ tải thời gian CPU giữa tất cả các quy trình (theo mức độ ưu tiên của chúng, điều này là bình thường theo mặc định và bạn có thể đặt cho mọi quy trình một cách rõ ràng). Bạn có thể hiểu rõ hơn về các quy trình Erlang là gì từ đây: http://c2.com/cgi/wiki?GreenVsNativeThreads – demeshchuk

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