2010-06-04 40 views
8

Tôi đã có một cuộc thảo luận với bạn của tôi ngày hôm trước. Tôi đã nói như thế, trong Lua thuần khiết, bạn không thể xây dựng một hệ thống đa nhiệm ưu tiên. Ông tuyên bố rằng bạn có thể, vì lý do sau:Đa luồng trong Lua

Cả C và Lua không có thư viện luồng sẵn có [OP lưu ý: tốt, Lua về mặt kỹ thuật, nhưng AFAIK không hữu ích cho mục đích của chúng tôi]. Windows, được viết bằng phần lớn C (++) có đa nhiệm trước, mà chúng được xây dựng từ đầu. Vì vậy, bạn sẽ có thể làm tương tự trong Lua. Vấn đề lớn mà tôi thấy với điều đó là cách làm việc đa nhiệm ưu tiên chính (theo kiến ​​thức của tôi) là nó tạo ra các ngắt thường xuyên mà người quản lý sử dụng để kiểm soát và xác định mã nào sẽ hoạt động tiếp theo. Tôi cũng không nghĩ rằng Lua có bất kỳ cơ sở nào có thể làm điều đó.

Câu hỏi của tôi là: là có thể viết một thư viện thuần-Lua cho phép mọi người có đa nhiệm trước khi làm trống không?

+0

FYI Đây không phải là câu trả lời cho câu hỏi của bạn (thuần Lúa thực hiện đa luồng), nhưng đối với người chỉ muốn chạy mã Lue nhiều hệ điều hành, và lên lịch cho họ trước, có nhiều tùy chọn: http: // kotisivu. dnainternet.net/askok/bin/lanes/comparison.html – pts

Trả lời

7

Tôi không thể thấy cách thực hiện, mặc dù không có ngữ nghĩa chính thức của Lua (ví dụ như ngữ nghĩa của ví dụ yield), thực sự khó có thể đưa ra lý lẽ sắt thép tại sao nó không thể thực hiện được. (Tôi đã muốn một ngữ nghĩa chính thức cho độ tuổi, nhưng rõ ràng Roberto và lhf có những việc tốt hơn để làm.)

Nếu tôi muốn đa nhiệm trước cho Lua, tôi thậm chí sẽ không cố gắng làm điều đó trong Lua thuần khiết. Thay vào đó tôi muốn sử dụng một thủ thuật cũ đầu tiên tôi nhìn thấy cách đây 20 năm trong Standard ML New Jersey:

  • Interrupt đặt một lá cờ trong lua_State nói "coroutine hiện tại đã được preempted".

  • Thay đổi máy ảo sao cho trên mọi vòng lặp và mọi cuộc gọi hàm, nó sẽ kiểm tra cờ và sản lượng nếu cần.

Bản vá này sẽ dễ viết và dễ bảo trì. Nó không giải quyết được vấn đề của hàm C chạy dài mà không thể được làm trống trước, nhưng nếu bạn phải giải quyết vấn đề đó, bạn đang lang thang vào lãnh thổ khó khăn hơn nhiều, và bạn cũng có thể làm tất cả luồng của mình tại mức C, không phải cấp Lua.

+0

Cảm ơn thông tin :) – RCIX

+0

"Thay đổi máy ảo sao cho trên mọi vòng lặp và mọi cuộc gọi hàm, nó sẽ kiểm tra cờ và sản lượng nếu cần." Chúng tôi đã làm điều này trở lại sau đó khi phát triển với các phiên bản đầu tiên của Smalltalk cũng không được ưu tiên. Điều gì đã xảy ra là địa ngục đã tan vỡ. Tất cả sản lượng bất ngờ xảy ra vào những thời điểm mà chúng không xảy ra trước đó. Điều này dẫn đến nhiều khu vực mutex không được đồng bộ hóa propperly để chạy vào các công tắc ngữ cảnh và tạo dữ liệu cũ. Có lẽ LuaJ thừa hưởng đa luồng ưu tiên trong Java? – OlliP

5

Không phải là tôi biết, không. Nó sẽ gần như là vô lý đơn giản nếu bạn có thể thu được từ móc đặt trên coroutines với debug.sethook mặc dù, nhưng nó không hoạt động. Bạn có thể năng suất từ ​​C móc đặt từ C (lua_sethook), nhưng tôi không thể tìm ra chính xác để làm điều đó, và nó không phải là Lua tinh khiết anyways.

Thậm chí nếu có thể, nó sẽ không thực sự là luồng. Tất cả mọi thứ sẽ vẫn chạy trong cùng một chuỗi hệ điều hành, ví dụ. Móc của bạn sẽ có nhiều yếu tố vào tài khoản (chẳng hạn như thời gian, có lẽ bộ nhớ, vv) và sau đó xác định liệu để mang lại. Các coroutine mang lại sau đó sẽ quyết định coroutine con để chạy tiếp theo. Bạn cũng cần phải quyết định khi nào móc phải được gọi. Thường xuyên nhất sẽ được trên mỗi hướng dẫn Lua, nhưng mà mang một hình phạt hiệu suất. Và nếu coroutine gọi vào một hàm C, Lua không có thẩm quyền. Nếu cuộc gọi C đó mất nhiều thời gian, bạn sẽ không thể làm được gì.

Here 's một chuỗi liên quan từ danh sách gửi thư Lua-L mà bạn có thể thấy thú vị.

+0

Supreme Commander sử dụng hệ thống luồng "giả" như vậy, mặc dù nó có một tinh chỉnh tùy chỉnh của tôi nghĩ. Đó là những gì truyền cảm hứng cho câu hỏi :) – RCIX

+0

Thành thật mà nói, tôi muốn _love_ để có thể làm điều này. Nó sẽ làm cho một vài vấn đề tôi đi qua rất nhiều dễ dàng hơn để xử lý decently. – Twisol

5

No. Không thể viết lịch trình ưu tiên trong Lua thuần túy.Tại một thời điểm nào đó, một bộ lập lịch preemptive cần một số cơ chế như một thường trình dịch vụ ngắt để kiểm soát khỏi luồng hiện tại và đưa nó cho bộ lập lịch mà sau đó có thể đưa nó đến một luồng khác. Pure Lua không có cơ chế này.

Bạn đề cập đến Windows được viết chủ yếu là C/C++. Từ khóa chủ yếu là. Bạn không thể viết một lịch trình ưu tiên trong ANSI C/C++ tinh khiết. Thông thường, một phần của thường trình dịch vụ ngắt được viết bằng ngôn ngữ assembly. Hoặc, trình biên dịch C/C++ triển khai một phần mở rộng không chuẩn, cho phép các thường trình dịch vụ ngắt được viết bằng C/C++. Một số trình biên dịch cho phép bạn khai báo một hàm với một trình sửa đổi __interrupt làm cho trình biên dịch tạo ra một kéo dài/epilog cho phép hàm được sử dụng như một thường trình dịch vụ ngắt.

Ngoài ra, mã thiết lập gián đoạn dịch vụ gián đoạn thường xuyên với các thanh ghi CPU có bộ nhớ ánh xạ IO hoặc hướng dẫn IO. Không có mã nào là ANSI C/C++ di động. Và, phụ thuộc vào kiến ​​trúc CPU.