196

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

4

4 に答える 4

233

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

L[0] += 1

+=はアトミック操作ではないため、別のスレッドが同じことを行った場合に L[0] が実際に 1 増加するとは限りません。(Python では、実際にアトミックな操作はほとんどありません。ほとんどの操作で、任意の Python コードが呼び出される可能性があるためです。)保護されていないリストを使用するだけでは、競合のために間違ったアイテムを取得または削除する可能性があるため、キューを使用する必要があります。条件。

于 2011-06-12T00:00:40.593 に答える
123

トーマスの優れた答えのポイントを明確にするために、スレッドセーフでappend() あることに言及する必要があります。

これは、一度書き込みを行うと、読み取られるデータが同じ場所にあるという懸念がないためです。この操作はデータを読み取るのではなく、データをリストに書き込むだけです。append()

于 2013-09-02T07:45:07.717 に答える
48

操作の例と、listそれらがスレッドセーフであるかどうかの包括的ではあるが網羅的ではないリストを次に示します。ここobj in a_listで言語構造に関する答えを得たいと思っています。

于 2013-11-01T14:15:20.457 に答える