2010-03-23 4 views
2

최근 C++ 및 Lua를 사용하여 개발할 때 많은 어려움을 겪었습니다. 내 상황은 : 어떤 이유로, 내 C++ 프로그램에 수천 개의 루아 - 스테이트가있을 수 있습니다. 그러나 이러한 상태는 초기화 직후에 동일해야합니다. 물론, 각 상태에 대해 luaL_loadlibs() 및 lua_loadfile()을 수행 할 수 있지만 꽤 무겁습니다 (사실 초기 상태 일지라도 오랜 시간이 걸립니다). 그래서, 나는 다음과 같은 스키마를 궁금해합니다 : 다른 루아 - 상태를 위해 복제 된 별도의 루아 - 스테이트 (초기화되어야하는 유일한 상태)를 유지하는 것은 가능한가?lua 상태 복제

+2

이 스레드는 대략 같은 질문을 던집니다 : http://stackoverflow.com/questions/1383768/cloning-lua-state –

+0

[Cloning Lua state] 중복 가능성 있음 (http://stackoverflow.com/questions/1383768/) cloning-lua-state) – greatwolf

답변

1

불행히도, 아니요.

명왕성을 사용해 전체 상태를 직렬화 할 수 있습니다. 그것은 잘 작동하지만 대부분의 경우 일반 초기화와 대략 동일한 시간이 소요됩니다. 당신은 내가 한 번 상태의 수천 프로그램을 쓴 것처럼 내가 완전히 잘못을하고 있었는데 :) 루아 코 루틴 스레드를 가지고

실현 될 때까지

+0

명왕성은 써드 파티 툴입니다. lua 스크립트에서 명왕성을 사용할 수 있습니다. C++ 환경에서 루아 스테이트를 복제하는 것이 좋습니다. – hbxfnzwpf

+0

기능이 루아 측에서 액세스 할 수 있다면 왜 문제가됩니까? 아마도 등록 된 C 함수를 살펴보고 상태를 직렬화하기 위해 호출하는 함수를 호출 할 수있을 것입니다. 루아에서 접근 할 수있는 기능을 원하지 않으면 사용자를 위해 등록하지 마십시오. 전반적으로 이것이 최상의 솔루션이 될 것 같지 않습니다. –

3

나는, 같은 문제 및 생각을했다, 루아 시작하면 이 기능을 사용하여 필요한 것을 수행해야합니다. 처음에는 좀 까다로울 수 있지만 며칠 후에는 이해할 수 있어야합니다. 시간 가치가 있습니다.

+0

코 루틴은 실제로 루아의 훌륭한 기능입니다. 그러나 C++ 프로그램에서 루아 상태를 복제하는 방법을 찾고 있습니다. 루아 스크립트가 각기 다른 사람이 작성할 수 있으므로 내 C + + 프로그램, 멀티 스레드에서로드하는 것이 좋다. 생성 된 모든 lua 상태는 동일한 lib를로드하고 해당 스크립트를로드하기 전에 또 다른 공통 스크립트를로드해야하기 때문에 lua_open()에 의해 반환 된 모든 lua 상태에 대한 lua_loadlib() 및 lua_load()는 큰 부담입니다. 클론 루아 국가를 방황하고 있습니다. – hbxfnzwpf

0

나는 상태를 복사하는 것만으로 내부 참조뿐만 아니라 잠재적으로 외부 데이터에 대한 포인터를 가지므로 주어진 요청을 정확히 수행하기는 어려울 것이라고 생각한다. 클론 소스를 가리키는 여러 상태를 보유하는 것뿐만 아니라 이러한 내부 참조를 재구성해야합니다.

하나가 시작한 후 상태를 직렬화 한 다음 후속 상태로로드 할 수 있습니다. 초기화가 실제로 비용이 많이들 경우, 그만한 가치가있을 것입니다. http://en.wikipedia.org/wiki/Fork_(operating_system)

경우 :

나는 당신이 그 하나 개의 상태를 초기화하고 다음 분기가 다른 프로세스의 상태를 넣어하는 것입니다 상대적으로 쉬운 것입니다 원하는 일을 가장 가까운 일을 생각하지만 운영 체제는이를 지원 당신은 루아 안에서 사용할 수있는 것을 원한다면 다음과 같은 것을 시도해 볼 수있다. How do you construct a read-write pipe with lua?

0

다음 루아 API 호출을 살펴 보라. 내가 정확히 생각하는 것 같아.

lua_State *lua_newthread (lua_State *L); 

이는 스택에 밀어, 새 스레드를 생성하고,이 새로운 스레드를 나타내는 lua_State에 대한 포인터를 반환한다. 이 함수가 반환 한 새 스레드는 원래 스레드와 전역 환경을 공유하지만 독립 실행 스택을 갖습니다.

스레드를 닫거나 소멸시키는 명시 적 기능은 없습니다. 스레드는 모든 Lua 객체와 마찬가지로 가비지 콜렉션의 대상이됩니다.