4

Python では、さまざまなスレッドによって読み取り/インクリメントされるグローバル変数が定義されています。GIL が原因で、ロック機構を使用しなくても問題が発生することはありますか?

4

2 に答える 2

6

GIL は、別のスレッドが引き継ぐ前に、インタープリターが 1 つのバイトコード命令を完全に実行することのみを必要とします。ただし、インクリメント操作が単一の命令であると想定する理由はありません。例えば:

>>> import dis
>>> dis.dis(compile("x=753","","exec"))
  1           0 LOAD_CONST               0 (753)
              3 STORE_NAME               0 (x)
              6 LOAD_CONST               1 (None)
              9 RETURN_VALUE
>>> dis.dis(compile("x+=1","","exec"))
  1           0 LOAD_NAME                0 (x)
              3 LOAD_CONST               0 (1)
              6 INPLACE_ADD
              7 STORE_NAME               0 (x)
             10 LOAD_CONST               1 (None)
             13 RETURN_VALUE

ご覧のとおり、これらの単純な操作でさえ、単一のバイトコード命令以上のものです。したがって、スレッド間でデータを共有する場合は常に、データの一貫性を維持するために別のロック メカニズム (threading.lock など) を使用する必要があります。

于 2010-01-28T19:40:46.487 に答える
3

はい、ロックなしのマルチスレッドは、GIL の有無にかかわらず、ほとんどの場合問題を引き起こします。

于 2010-01-28T19:19:22.107 に答える