2013-10-15 17 views
5

Theo sách hướng dẫn lua 5.1, lua_xmove di chuyển các giá trị giữa các ngăn xếp của các luồng khác nhau thuộc cùng một trạng thái Lua. Nhưng, tôi vô tình tình cờ sử dụng nó để di chuyển các giá trị qua các trạng thái Lua khác nhau và nó dường như hoạt động tốt! Có API nào khác để di chuyển các giá trị từ trạng thái Lua này sang trạng thái khác (trong 5.1) hoặc có thể sử dụng lua_xmove không?lua_xmove giữa các trạng thái lua khác nhau

+1

Một trong những cách di chuyển/sao chép Lua đối tượng giữa khác nhau 'Lua States' về chủ đề khác nhau: http://stackoverflow.com/a/9573063/1150918 – Kamiccolo

+1

Tôi đã chọn mã * LuaLanes * và tôi thấy mã đang thực hiện sao chép từ trạng thái này sang trạng thái khác. Cảm ơn. – vyom

Trả lời

5

Lua lưu trữ dữ liệu thu gom rác thải ở trạng thái toàn cầu. Vì vậy, nếu bạn di chuyển các đối tượng GC hoặc chuỗi trên các trạng thái, bạn có khả năng gây nhầm lẫn cho bộ thu gom rác và tạo các tham chiếu treo lơ lửng.

Vì vậy, mặc dù có vẻ như nó hoạt động, nó có thể dễ dàng gây ra các vấn đề sau này.

Để tham khảo, hãy xem this mailing list thread nơi các nhà phát triển thảo luận vấn đề chính xác này.

Lưu ý rằng lua_xmove không kiểm tra mà các quốc gia toàn cầu đều giống nhau:

api_check(from, G(from) == G(to)); 
+2

Lưu ý rằng 'api_check' thay đổi hành vi dựa trên các tùy chọn biên dịch thời gian. Xem chương 3 của sách hướng dẫn (ch 4 trong 5.2) và luaconf.h. Tôi tin rằng bản phát hành bình thường của Lua không cho phép kiểm tra API. – RBerteig

+0

Mục đích của kiểm tra api là tinh thể rõ ràng, 'from' phải bằng' to'. – doug65536

+1

Cái gì? Không, 'from' không được bằng' to', điều đó sẽ dẫn đến không có op. Điều gì là đúng là trạng thái toàn cầu (một kết quả từ một lời gọi đến 'lua_newstate()' trong cây trạng thái phải giống nhau cho cả hai đối số. Nói cách khác, cả hai 'to' và' from' là kết quả của một (có thể rỗng) chuỗi các cuộc gọi 'lua_newthread()' bắt nguồn từ một số trạng thái ban đầu 'L'. – BadZen

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