2010-06-10 19 views
13

Tôi có một chương trình có 4 luồng.nhúng nhiều bản sao lua trong một chương trình nhiều luồng

Trong mỗi chủ đề, tôi thực hiện một luaL_newstate();

Mỗi chuỗi chỉ có quyền truy cập vào ví dụ lua riêng của nó.

Có điều gì tôi cần phải lo lắng không? [I E. có một số trạng thái ẩn mà tất cả các trường hợp lua chia sẻ sau lưng của tôi?]

Cảm ơn!

Trả lời

19

Không, điều đó sẽ hoạt động tốt. Tất cả trạng thái thông dịch là tự chứa trong mỗi cá thể Lua. Tôi thậm chí sẽ nói rằng đó là cách ưa thích để sử dụng Lua với nhiều luồng và/hoặc quy trình.

Nếu bạn thấy rằng bạn cần giao tiếp giữa các quốc gia Lua, thì tốt nhất là tuần tự hóa dữ liệu và chuyển nó qua API C. Tôi khuyên bạn nên đọc "báo cáo" Exploring Lua for Concurrent Programming ". Nó giới thiệu một phương pháp sử dụng nhiều Lua processes với message passing cho inter-process communication.

5

Tạo một đơn lua_State cho mỗi luồng là giải pháp tốt để có nhiều luồng thực thi Lua. Tuy nhiên, các trạng thái này là cách nhau rất. Đặc biệt, rất khó để giao tiếp một cách an toàn giữa chúng vì API Lua chỉ an toàn cho luồng miễn là mỗi lua_State được truy cập từ một chuỗi duy nhất tại một thời điểm. (Vâng, trừ khi lua_locklua_unlock được triển khai như là một mutex phù hợp, mà chúng không có trong bản dựng lõi lua mặc định.)

Nếu mức độ cô lập đó không được chấp nhận, thì bạn cần điều tra một trong số cơ chế cho phép các cá thể Lua chơi tốt với những người khác trong một quy trình luồng.

Lựa chọn ưa thích của tôi là Lua Lanes cung cấp nhiều chủ đề cùng với cơ chế truyền tin nhắn và chia sẻ giá trị giữa chúng theo cách an toàn. Giá trị của hầu hết các loại Lua (bao gồm userdata với một chút hỗ trợ bên C từ thư viện sử dụng nó) có thể được an toàn và hiệu quả thông qua từ một làn khác.

Các cơ chế khác tồn tại và điểm khởi đầu tốt cho hầu hết trong số đó là ở số wiki page on MultiTaksing của người dùng Lua.

3

Bạn tốt miễn là bạn không cố gắng chuyển giá trị giữa các trường hợp Lua mà không chuyển đổi chúng thành C trước tiên. Ví dụ, gần như không thể chia sẻ một bảng có thể thay đổi giữa các trường hợp.

Bạn yêu cầu âm thanh dễ dàng nhưng không nhất thiết hữu ích hơn là chỉ có nhiều quy trình đang chạy, mỗi quy trình có Lua riêng và không gian địa chỉ riêng.

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