2017-09-21 2 views
3

말, 루아 표가 t={"a"={}, "b"={}}입니다.lua 테이블 스레드는 안전합니까?

내 질문은 내가, 스레드 B는 t.b 읽기/쓰기 두 개의 스레드, 스레드 A, 스레드 B. 을 그리고는 읽기 전용을 lua_newthread 통해이 두 개의 스레드에 대해 개별적으로이 lua_State를 생성하고 스레드 경우/t.a 쓰기입니다 .

위의 각 스레드에서 lua_lock을 사용해야합니까?

대답이 '예'라면 t의 작업 중 lua_lock이 필요합니까?

+0

'lua_newthread'의 역할에 대해 읽어 보시기 바랍니다. – moteus

+0

답은 "예"입니다. 위의 각 스레드에서'lua_lock'을 사용해야합니다. –

+0

답변은 페이지의 답변 헤더 아래에 있습니다.) –

답변

0

아니요, 루아 테이블은 스레드로부터 안전하지 않습니다.

예, 테이블 t의 모든 작업에는 원자 조작이 없으므로 lua_lock이 필요합니다.

0

lua 테이블은 스레드로부터 안전하지만 스레드가 동일한 요소에서 읽기/쓰기를 수행하지 않으므로 잠금 할 필요가 없습니다.

+0

하지만 그들은 같은 테이블에 속합니다. – francis

0

TL : DR 엔진 상태는 스레드로부터 안전하지 않으므로 Lua 테이블을 스레드로부터 안전하게 만들 필요가 없습니다.

lua_State은 엔진 상태가 아니지만 엔진 상태는 아닙니다. 대신 응용 프로그램 스레드와 관계가없는 루아 스레드의 상태입니다. 루아 엔진은 본질적으로 단일 스레드이기 때문에 동일한 엔진 상태의 루아 스레드는 동시에 실행할 수 없습니다 (동시에 임의의 수의 엔진을 사용할 수도 있습니다) 대신 협력 적으로 멀티 태스킹됩니다.

그래서 lua_State *lua_newthread (lua_State *L);은 OS 스레드가 아닌 새로운 루아 스레드를 생성합니다. , https://www.lua.org/manual/2.1/subsection3_5_6.html
현대적인 방법은 레지스트리를 사용하고 있습니다 :

lua_lock 등 안전을 스레드를 참조하지만, 루아는 구현의 버전 2에서 엔진에 호출을 통해 객체의 네이티브 코드 보류를 유지할 수있는 방법이었다 않는다 원시 코드에서 액세스 할 수있는 루아 테이블 : http://www.lua.org/manual/5.3/manual.html#4.5

관련 문제