2016-07-15 19 views
1

私のC++プログラムにLuaスクリプトをロードし、そのスクリプトを別のスレッドで複数回呼び出すことができます。私は各スレッドでスクリプトをロードすることを避けようとしています(なぜそのオーバーヘッドを通過するのか)。複数のスレッドで複数の状態でLuaスクリプトを一度ロードする

私はC++プログラム内でこのような何かを考えている:

create lua state L 
load script into L 

とn個のスレッドでは、実行します。

create local lua state Si (i = 1..n, i.e., separate state per thread) 
grab "compiled" script from L and invoke in the context in Si 

これを行うに "標準" アプローチはありますか?主な目的は、各スレッドにスクリプトをロードさせないようにすることです。スクリプトは、状態Siにおいて複数回実行されてもよい。別々のスレッドで実行されているスクリプトは連携していない(つまり、互いについては何も知らず、そのまま維持したい)ということに注意してください。

+1

C++スレッドまたはluaスレッドについて話していますか? Luaには、実際には異なるプログラムスレッドを意味しないスレッドという概念もあります。また、基本的に単一の状態を強制するデータレースやミューテックスがなければ、あなたが望むことができるとは思えません。各状態でスクリプトを実行する必要があり、各状態は別の状態でなければなりません。 – Rochet2

+0

私は別々のC++スレッドについて話しています。メインプログラムはステートLでスクリプトをロードします。Lで作成されたスクリプトを適用したい後のC++スレッドが作成されますが、新しいC++スレッドであり、同じスクリプトを同時に実行するスレッドの倍数がある可能性があるので、スクリプトがスレッド固有の状態で実行されるようにします。上の私のピジンコードはC++コードです。 – mkilian

答えて

1

私がコメントで言ったように、すべての並列実行をブロックするデータ競合やmutexのないC++スレッドでは、あなたが望むことはできないと思います。 単一のLUA状態は複数のスレッドで使用されるようには設計されておらず、LUAスレッドはマルチスレッドをサポートしていないため、まったく別の状態から別の状態にデータを移動する方法はありません。

しかし、あなたが試すことができ、あなたがバイトコードから速くスクリプトをロードするために、すべてのスレッドからアクセスできるようにloadstringを行うことによって状態のLUAスクリプトを「コンパイル」し、その後dumpと安全な方法でそれを保存することです直接ロードストリングで。

そうしないと、すべての州を別々に保ち、それらの間のすべての通信をC++で行い、そこでスレッドの安全を確保する必要があります。

+0

答えは、ルアオブジェクトは状態間で共有できないようだと思います。 luaには「ネスト」状態の概念がありません。つまり、グローバル状態のスクリプトを解析して、グローバル状態にアクセスできるネスト状態を作成します(ローカル状態を変更します)。 – mkilian

+1

@mkilian luaにはネストされた状態がありますが、同時に複数のC++スレッドからそれらを使用することはできません。本当に問題は、スレッドセーフな方法で何もできないということです。 luaへのすべてのアクセスは、その設計上、シングルスレッドであることが保証されなければなりません。 – Rochet2

関連する問題