1

私はLUAのスレッドで作業しており、コードでこれにlua_newthreadを使用しているので、同じ関数をn回実行する必要があります。

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

前回のアプリケーションでは、コマンドlua_gc(thread、LUA_GCSTOP、0)を使用しましたが、エラーが解決しませんでした。

私が試したもう1つの戦略は、lua_resumeの各実行を終了することでした。コマンドlua_settop(thread、0)を追加して、バッテリーが消耗し、メモリスペースを消費しないようにしました。

私を助けてください、何が起こる可能性がありますか?

4

1 に答える 1

4

Lua スレッドはCPUスレッドとは異なります。Lua はスレッドセーフではありません。実際のスレッド間で Lua コードを並行して実行することはできません。Lua は協調的なマルチタスクを可能にしますが、実際の CPU スレッドは可能ではありません。

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

だから、あなたがしていることを再構築する必要があります。スレッドを使用する代わりに、lua_newstateCPU スレッドごとに 1 つの Lua 状態を作成するために使用します。それぞれlua_Stateが残りから完全に独立しています。

于 2011-12-03T04:12:33.400 に答える