2009-03-14 3 views
7

루아 코드를 표준 "lua_pcall"함수 호출보다 더 세분화 된 수준에서 C/C++ 프로그램에서 실행할 수 있습니까? 이상 적으로는 저수준 바이트 코드 명령어 목록을 반복 할 수 있기를 원합니다. (그런 일이 있다고 가정합니다.) 하나씩 실행하여 실행중인 것보다 더 많은 것을 제어 할 수있는 자체 스케줄러를 작성할 수 있습니다. 처음부터 끝까지 완전한 루아 함수.저수준 루아 인터프리터

루아 코드가 호출 할 수있는 C 함수를 구현하기를 원하기 때문에 실행을 계속하기 전에 특정 (잠재적으로 장황한) 액션이 완료 될 때까지 기다리는 것이 필요하기 때문입니다. 일반적인 루아 스크립트에는 그러한 함수 호출의 비율이 높을 것이므로 일단 액션이 완료되면 콜백을 사용하도록 다시 작성한다는 아이디어는 실제로 실용적이지 않습니다.

답변

14

아마도이 질문을 무시할 수는 없겠지만 사용자 정의 C가 아닌 루아 코 루틴을 사용하여 이벤트가 발생할 때까지 기다릴 수 있습니다.

예를 들어, 하나의 코 루틴은 waitForEvent() 함수를 호출 할 수 있습니다. 이 이벤트가 발생할 때까지 다른 Coro로 전환 한 다음 첫 번째 Coro를 재개 할 수 있습니다. 자세한 내용은 the lua coro docs을 참조하십시오.

+1

이 솔루션은 특히 C API가 coroutines 자체를 생성/재개 할 수 있다는 점에서 많은 잠재력을 갖고있는 것으로 보입니다. – andygeers

6

코 루틴을 사용하는 Jder의 제안은 루아의 협업 스레딩 (명시 적 출력) 기능을 사용하여 길게 기다리는 C 루틴을 작성할 수 있으면 매우 잘 작동합니다. 루아를 입력하기 위해 lua_pcall()을 사용하지만, 엔트리 포인트는 코 루틴 관리자 함수가됩니다.

이것은 C 루틴이 기다리는 동안 아무 것도하지 않으면 작동합니다. 예를 들어 계산을했기 때문에 실행 시간이 길다면 여러 OS 스레드를 실행해야합니다. 루아는 threadsafe입니다. 단지 다중 쓰레드를 생성하고 각 쓰레드에서 lua_open()을 실행하면됩니다.

http://www.lua.org/pil/24.1.html에서 루아 라이브러리는 전혀 글로벌 변수를 정의하지 않습니다. 그것은 상태를 동적 구조로 유지합니다. lua_State 및이 구조체에 대한 포인터가 루어 내의 모든 함수 에 대한 인수로 전달됩니다. 이 구현은 다중 스레드 된 코드에서 Lua를 재진입 및 사용할 준비가되었습니다.

두 가지 방법을 결합 할 수도 있습니다. OS 쓰레드를 시작하는 래퍼 (wrapper) 함수가 있다면 쓰레드를 시작한 후에 얻을 수있다. 코 루틴 관리자는 스레드를 추적하고 시작된 스레드가 완료되면 코 루틴을 계속 수행합니다. 이를 통해 순수 C 코드를 실행하는 다중 작업자 스레드에서 단일 Lua 인터프리터를 사용할 수 있습니다.

5

OS 스레딩 방법을 사용하는 경우 Lua Lanes을 확인하십시오. 나는 당신이 달성하고자하는 것에 대한 완벽한 해결책을 보게 될 것입니다. (= 하나의 애드온 모듈을 믹스에 던져서 멀티 스레딩이 완벽하게 내장 된 명확하고 이해할 수있는 간단한 코드를 만들 것입니다.)

문제가 해결 된 방법을 알려주십시오. :)

+0

링크를 가져 주셔서 감사합니다. – andygeers