1. ホーム
  2. python

[解決済み] リストはスレッドセーフか?

2022-04-21 23:47:58

質問

複数のスレッドがある場合、リストではなくキューを使用することがよく提案されていることに気がつきました。 .pop() . これはリストがスレッドセーフでないためでしょうか、それとも他の理由でしょうか?

解決方法は?

リストそのものはスレッドセーフです。CPython では GIL がそれらへの同時アクセスから保護し、他の実装ではリストの実装のために細かいロックや同期されたデータ型を使用するように気を配っています。しかし、リスト それ自体 は同時にアクセスしようとしても壊れることはありませんが、リストの データ は保護されない。例えば

L[0] += 1

は、他のスレッドが同じことをしても、実際にL[0]を1つ増やすことは保証されません。 += はアトミックな操作ではありません。(Pythonで実際にアトミックな操作は非常に少ないです。なぜなら、それらのほとんどは任意のPythonコードが呼び出される可能性があるからです)。もし、保護されていないリストを使用したなら、あなたは、取得または削除されるかもしれないので、Queueを使用するべきです。 間違った項目 というのは、レースコンディションのためです。