2011-12-03 18 views
1

を停止していると私は同じ機能をn回実行しなければならない私のコードでは、このためにlua_newthreadを使用しています。 C + +で、各スレッドのためのいくつかのスレッドをインスタンス化し、競争のスレッドで動作するようにlua_newthreadは私がLUAのスレッドにして働いている

はlua_stateこのlua_stateは= lua_newthreadを割り当てます。 このスレッドはアプリケーションの最後でのみ破棄されるため、これらのスレッドのlua_state属性を常に再利用しています。私の質問は、いくつかの実行時間の後に これは、クラッシュがアプリケーションで発生する、これはガベージコレクタによって引き起こされる可能性がありますか?私の最後のアプリケーションで

私は、コマンドlua_gc(スレッド、LUA_GCSTOP、0)を使用し、まだエラーが持続しました。

lua_resumeを実行するたびにlua_settop(thread、0)コマンドを追加しました。バッテリーが放電され、 はメモリスペースを消費しませんでした。

どうすればいいですか?

答えて

4

LuaのスレッドはCPU-スレッドのようにないです。 Luaはスレッドセーフではありません。 は、実際のスレッド間で並列にLuaコードを実行できません。 Luaは協調マルチタスクを可能にしますが、実際のCPUスレッドは許可されません。

あなたは彼らが真に独立している場合にのみ、異なるCPU-スレッドから異なる実際のlua_Stateオブジェクトに呼び出すことができます。ルートlua_StateからLuaスレッドを作成した場合は、そのLuaスレッドでLuaコードを呼び出すことはできませんが、ルートのLuaコードも呼び出すことはできません。lua_State 2つのLuaスレッドが同じ親のlua_Stateを共有している場合、これらのLuaスレッドの両方でLuaコードを同時に実行することはできません。

あなたは何をやっているのかを再構成する必要があります。スレッドを使用する代わりに、lua_newstateを使用して、CPUスレッドごとに1つのLua状態を作成します。各は残りの部分とは完全に独立しています。

+0

ありがとうございました! 戦略lua_Stateを完全に独立させて使用すると、グローバル変数の共有のみを達成する方法はありますか? グローバル変数にアクセスする必要があります。この場合、これらの変数にアクセスするにはLOCKおよびUNLOCKメソッドを使用します。 –

関連する問題