2017-09-21 10 views
3

私はルアテーブルt={"a"={}, "b"={}}を持っています。luaテーブルスレッドは安全ですか?

私の質問だけt.bを読み出し/書き込みスレッドB、私は2つのスレッド、スレッドA、スレッドB. を持っていると私はlua_newthreadを介してこれらの二つのスレッドごとに個別に2 lua_Stateを作成し、読み取り専用スレッド場合/ t.aを書き、あります。

上記の各スレッドでlua_lockを使用する必要がありますか?

答えがYESの場合、tのいずれかの操作でlua_lockが必要ですか?

+0

'lua_newthread'が何をしているのかを読むことをお勧めします。 – moteus

+0

答えは "YES"です。上の各スレッドで 'lua_lock'を使うべきです。 –

+0

回答はページのあなたのアンサーヘッダの下にあります;) –

答えて

0

いいえ、luaテーブルはスレッドセーフではありません。

はい、テーブルtのすべての操作は、いずれもアトミック操作ではないため、lua_lockが必要です。

0

luaテーブルはスレッドセーフではありませんが、スレッドは同じ要素に対して読み書きできないため、ロックする必要はありません。

+0

しかし、それらは同じテーブル 't'に属しています – francis

0

TL; DR:エンジンの状態はスレッドセーフではないため、スレッドセーフである必要はありません。

lua_Stateはエンジン状態ではありませんが、それを参照しています。代わりに、それはアプリケーションスレッドと関係のないLuaスレッドの状態です。 Luaエンジンは本質的にシングルスレッドであるため(同じ時間に任意の数のエンジンを使用する可能性があります)、同じエンジン状態のLuaスレッドは同時に実行することはできず、協調的にマルチタスキングされます。

したがって、lua_State *lua_newthread (lua_State *L);は、OSスレッドではなく、新しいLuaスレッドを作成します。

lua_lockなどは安全性をスレッドを参照してくださいが、実装のバージョン2でエンジンへの呼び出し間でオブジェクトをネイティブコードのLUAのホールドを保つことができる方法であっていない:近代的な方法は、レジストリを使用しているhttps://www.lua.org/manual/2.1/subsection3_5_6.html
、ネイティブコードからアクセスできるLuaテーブル:http://www.lua.org/manual/5.3/manual.html#4.5

関連する問題