2017-05-08 13 views
0

マルチスレッドのC++アプリケーションにPythonを組み込みましたが、 Py_Initialize()を複数のスレッドで呼び出すのは安全ですか?それともメインスレッドで呼びますか?マルチスレッドでPy_Initialize()を呼び出す

+0

[静的変数を変更することはスレッドセーフですか?](http://stackoverflow.com/questions/43837721/is-it-thread-safe-to-modify-static-variable) –

+0

あなたはすでにこの質問をしています。異なる焦点にもかかわらず。私の回答を複製に記載してください。 –

答えて

0

Py_Initialize()コードが含まれています

if (initialized) 
    return; 
initialized = 1; 

関数の説明文も書かれています:

を第二のために呼ばれたときにこれは何もしませんtime(Py_Finalize()を最初に呼び出すことなく)。

あなたが行っていることにもよるが、複雑になることがありますが、メインスレッドからのみ行うことをお勧めします。

シグナルハンドラは、メインのPythonスレッドのコンテキストでのみ起動されるという問題があります。つまり、Py_Initialize()に電話をかけたスレッドが何であれ。したがって、一時的なスレッドで、一度しか使用されずに破棄された場合、シグナルハンドラを呼び出す機会はありません。だから、信号をどのように扱うかについていくつか考えなければなりません。

ネイティブスレッドAPIを使用してCコードで作成された一時的なスレッドを大量に使用し、Pythonインタープリタを呼び出す際にはそれぞれPythonインタプリタでデータを作成するので注意してください。これらの外部スレッドの作成と破棄を続けると、それが蓄積されます。外部スレッドからの呼び出しの場合はスレッドプールを使用し、以前のスレッドの再利用を続けるように努力する必要があります。

+0

'Py_Initialize()'が複数のスレッドで呼び出された場合、別のスレッドが '1 'に書き込んでいる間にあるスレッドがこの変数を読み込み中であれば、スレッドの安全性をどのように保証しますか? – Allanqunzi

+0

はい、おそらく別の問題です。その場合、 '' Py_Initialize() ''の呼び出しの回りにmutexロックを使う必要があります。 –

関連する問題