2012-03-08 5 views
3

スレッドモジュールを持つPythonコードに2つのスレッドと1つのグローバル変数があるとしましょう。 このコードでは、thread-1だけがグローバル変数の値を変更しますが、thread-2はグローバル変数の値を読み取り、その値に応じてタスクを実行します。Pythonのスレッディングモジュールの下にグローバル変数をロック

この場合、グローバル変数へのアクセスをLock()で保護する必要がありますか? Cでは、そのような条件下でmutexを使用する必要があります。しかし、GILのpythonはどうですか?それは今の場合ですか? Lock()はまだ必要ですか?

答えて

8

グローバル変数にオブジェクト値を割り当てることは、Pythonのアトミックな操作です。他のスレッドは、割り当て中に変数を読み取ることによって変数を誤って読み取ることはできません。 GILはPythonのC実装でこれを保証していますが、他の実装でも同じ保証ができます。

グローバル変数がリストのような変更可能なオブジェクトであり、そのオブジェクトを変更する場合は、使用するメソッドによって異なります。リストのような組み込みオブジェクトのほとんどのメソッドはアトミックです。

しかし、その変数の目的と使用方法の詳細を知らなくても、ロックは必要ないとは言えません。スレッド2がその値に基づいて動作を変更する必要があるのはなぜですか?スレッド2がその決定を行った直後にスレッド1が値を変更しても問題ありませんか? OKでない場合は、まだロックが必要な場合があります。

(Cに類似の状況 - - ポインタ変数に値を割り当てるは、ポインタ割り当てを並べ替えることができるがあなたがCのロックを回避するために、いくつかの状況においてこれを使用することができ、また、通常の状況下での原子です)
関連する問題