1

設計と C++ の実装についてアドバイスが必要です (私は Java の専門家で、C++ は初めてです)。

プロセスのリストがあります。1 つのスレッドがプロセスをリストに追加/削除し、2 つ目のスレッドが 10 ミリ秒に 1 回実行され、タイムアウトしたすべてのプロセスを収集 (およびリストから削除) します。各プロセスには、リストに追加されたときの作成タイムスタンプがあります。3 秒経過してもプロセスがまだリストにある場合 (最初のスレッドによって削除されていない場合)、クリーナー プロセスによってリストから削除されます。

これは、オーバーヘッドを低く抑える必要があります。

したがって、add、remove、clean の 3 つのメソッドを持つ processListContainer があります。

add/removeById と clean の間で同期する必要があります。これは、クリーニング時に新しいリストを作成し、複数のリストを処理するなどの巧妙な考え方によって実行できます。

リストのサイズは約 100K で、1 秒で数千が追加されます

4

2 に答える 2

1

プロセスのリストをサブリストのリストに編成できます。各サブリストは、同じ 5 ミリ秒間隔内に期限切れになるプロセスのコレクションです。これにより、cleanerスレッドが古いプロセスを削除することを決定するときに、個々のプロセスを繰り返すのではなく、サブリスト全体をクリアできます。

リストには、最初は空のサブリストが含まれています。

操作はcleanループであり、終了条件はヘッド サブリストが空であるか、ヘッド サブリストが期限切れでないことです。ヘッド サブリストの有効期限が切れている場合は、リストを消去します。リストに複数のサブリストがある場合、結果の空のサブリストが削除されます。ループが繰り返されます。

そのためadd、プロセスが最後のサブリストに属しているかどうかを確認します。その場合、そのサブリストに自分自身を追加します。そうでない場合は、新しいサブリストを作成して自分自身を追加し、サブリストをリストに追加します。

要素は、指定されたremove要素をサブリストから削除します。サブリストが空になり、リストに複数のサブリストがある場合、空のサブリストが削除されます。

このスキームでaddは、末尾または無期限のサブリストのみを操作するため、ロックする必要はありません。cleanどちらもリストの先頭を操作する可能性があるため、remove両方ともロックが必要です。

于 2012-07-06T17:40:28.010 に答える
0

リストを 1 つだけ保持し、ミューテックスで保護する必要があります。また、「よりクリーンな」プロセスを避け、プロセスが完了するとプロセスがリストから削除されるようにします。

于 2012-07-06T17:12:04.417 に答える