2

この疑似コードを複数のスレッドで同時に実行すると、デッドロックが発生します。

Resource res1 = pool.get();
...
Resource res2 = pool.get();
...
pool.release(res2);
pool.release(res1);

それは予想される動作ですか?(そうだと思います)

プールのサイズがスレッド数の 2 倍の場合、デッドロックは発生しないようです。この記述は正しいですか?

コンピュータ サイエンスにおけるこの種のデッドロックに「科学的」な名前はありますか? いくつかのリンクをいただければ幸いです。

ありがとう

4

1 に答える 1

1

2 つのスレッドと 2 つのリソースがあるとします。

スレッド A が実行res1 = pool.get()され、1 つのリソースを取得します。スレッド B が実行res1 = pool.get()され、1 つのリソースを取得します。現在、プールが使い果たされているため、どちらのスレッドも終了できませんres2 = pool.get()

予備のリソース (少なくともスレッドn+1用のリソースn) が 1 つあれば、問題は解決します。その場合、1 つのスレッドが 2 つのリソースを取得して終了し、他のスレッドが使用するのに十分なリソースを解放することが保証されているためです。リソースの数を増やすと、並列処理が改善されます。スレッドの 2 倍のリソースがあるため、すべてのスレッドがブロックせずにリソースを取得できるため、すべてのスレッドが並列に実行できます。

私の知る限り、これは本質的に現象の教科書的な例であるため、単に「デッドロック」として知られています。両方のタスクは、必要なリソースを解放するために相互に待機しています。

于 2012-10-21T05:35:41.063 に答える