2010-08-05 31 views
5

Tôi có một vấn đề nhỏ với các chủ đề trong Erlang NIFs. Bạn có thể xem mã của tôi tại đây: http://pastebin.com/HMCj24Jp. Vấn đề là khi tôi bắt đầu thread phải mất một số đối số và bắt đầu chức năng generate_binary. Điều này là ổn nhưng khi tôi đang cố gắng để đọc các đối số tất cả mọi thứ bị treo.Các vấn đề với Erlang NIF và chủ đề

Nó có lẽ không phải là vấn đề phức tạp nhất, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về điều này vì vậy tôi hy vọng một số bạn có thể biết câu trả lời.

Trả lời

9

generate_buffer() NIF của bạn đang tạo một chuỗi để gọi generate_binary() nhưng NIF gọi điện không chờ chuỗi mới tạo xong. Các chủ đề chỉ được tạo ra và có khả năng vẫn chạy theo thời gian NIF trả về, mặc dù điều này sẽ không xác định, như là chủ đề nói chung. Có lẽ bạn đang gặp lỗi giả lập Erlang BEAM vì generate_binary() đang tắt để gọi vào hệ thống thời gian chạy Erlang sau khi generate_buffer() đã trở lại, gây nhầm lẫn cho người nghèo khủng khiếp.

Bây giờ, thậm chí giả sử bạn sửa lỗi này để làm cho nó làm những gì bạn muốn, tôi không nghĩ bạn nên sử dụng chủ đề bản địa rõ ràng ở đây cả.

Đầu tiên, Erlang NIF được cho là trông giống như các hàm Erlang thông thường, chỉ khác ở chỗ chúng xảy ra được viết bằng một ngôn ngữ khác. Các hàm Erlang không sinh ra các luồng thực thi riêng biệt, sau đó trả về, để lại chuỗi đó đang chạy. Ngoại trừ những người đối phó với I/O và lưu trữ dữ liệu liên tục, các hàm Erlang là xác định và referentially transparent. NIF của bạn không phải là. Vì vậy, ngay cả khi nó hoạt động, nó vẫn "sai" theo nghĩa là nó vi phạm kỳ vọng của một lập trình viên Erlang có kinh nghiệm.

Thứ hai, nếu bạn cần đa xử lý, Erlang đã cung cấp ý tưởng về quy trình. Nếu NIF của bạn thực sự thực hiện nhiều công việc mà nó có thể hưởng lợi từ đa xử lý, tại sao không làm lại NIF của bạn để nó có thể làm việc trên một dữ liệu con, sau đó gọi nó nhiều lần, mỗi lần từ một số quy trình Erlang? Sau đó, bạn không cần chủ đề gốc rõ ràng; trình giả lập BEAM sẽ tạo số lượng chủ đề tối ưu cho bạn, minh bạch.

Thứ ba, phí tạo chủ đề sẽ giết hiệu suất nếu tuổi thọ của chuỗi chỉ mở rộng trong quá trình thực hiện một cuộc gọi Erlang NIF, vì dường như bạn thực sự dự định. Đây là một lý do khác mà quy trình Erlang sẽ hiệu quả hơn ở đây.