3

私のアプリケーションは、グローバルミューテックスを使用するマルチスレッド環境でLuaを使用しています。これは次のように実装されました:

  1. スレッドロックミューテックス、
  2. 電話lua_newthread
  3. で初期化を実行しますcoroutine
  4. それでも僕らは走りlua_resumeますcoroutine
  5. ミューテックスのロックを解除

lua_lock/unlockluaがで動作する場合、が実装されていない場合、GCは停止しcoroutineます。

私の質問は、初期化プロセスでグローバルLua構造体が必要ない場合、ロックせずにステップ2と3を実行できますか?coroutineグローバルも必要としない場合、ロックせずにこのすべてのプロセスを実行できますか?

どのような場合、私は通常、ロックせずにLua関数を使用できますか?

4

2 に答える 2

1

どのような場合、私は通常、ロックせずにLua関数を使用できますか?

同じLua状態(または同じソースLua状態から派生したスレッド)で?

なし。

Luaは、個別のLua状態インスタンスを並行して実行できるという意味でスレッドセーフです。同じLua状態インスタンス上の2つの異なるスレッドからLuaAPI関数を呼び出す場合、スレッドの安全性はまったく保証されません。

同じ状態への同時アクセスを防ぐために、同期メカニズムの外部で手順2、3、または4を実行することはできません。新しいスレッド(メモリを割り当てる)を作成するだけなのか、「初期化プロセス」(メモリを割り当てる可能性が高い)を作成するだけなのかは関係ありません。メモリを割り当てないものでさえ、まだ許可されていません。

Luaは、Lua州内でのスレッドセーフについての保証を提供していません。

于 2012-10-09T17:28:09.343 に答える