私はCが嫌いです.クラスなしでこれを行う方法を考えなければなりません:(
OK、各ファイルを表す 'Sfile' 構造体。名前、パス、ファイル fd/ハンドル、1 つのファイルに関係するすべて、および「inUse」ブール値を持ちます。
ファイルのセットを待機しているスレッドの「waitingThreads」配列。
すべてのファイル、waitingThreads 配列、およびロック (mutex/futex/criticalSection) を保持するための *Sfile の配列を持つ 'Sfiles' 構造体。
各スレッドには、ファイルがすべて利用可能になるまで待機できるイベント/セマフォ/何かが必要であり、必要なファイルのセットにアクセスする方法と、ファイルの fds/ハンドル/その他のものを保存する場所が必要です。
では、始めましょう:
ファイルを必要とするスレッドはすべて、Sfile をロックし、*Sfile 配列を反復処理して、必要なすべてのファイルが自由に使用できるかどうかを確認します。それらがすべてある場合、「inUse」ブール値を設定し、fd/handles を使用して自身をロードし、ロックを解除して実行します。すべてのファイルがあります。必要なファイルが使用中の場合、それ自体を waitingThreads 配列にプッシュし、そのイベント/sema を待機します。
スレッドがファイルの処理を完了すると、Sfile がロックされ、使用していたファイルの「inUse」ブール値がクリアされます。次に、waitingThreads 配列を反復処理します。配列が空の場合は、ロックを解除して終了します。配列が空でない場合は、解放されたファイルで実行できるスレッドを見つけようとします。何も見つからない場合は、ロックを解除して戻ります。見つかった場合は、そのスレッドを fd/handles でロードし、inUse ブール値を設定し、そのイベント/sema を通知します。そのスレッドは、目的のファイル セットで実行されます。スレッドは、waitingThreads 配列を最後まで反復し続け、ロードできる mre スレッドを探して、残りの空きファイルを通知します。配列の最後に到達すると、戻ります。
それ、またはそれに似たものは、スレッドが常にファイルの完全なセットで実行され、スレッドがファイルの部分的なセットをロックすることによるデッドロックを防ぎ、ポーリングを必要としないことを保証します。
そのテーブルが本当に本当に必要な場合は、スレッドがロックに出入りするたびにロック内に構築できます。適切な構造体を malloc し、空きファイルと待機中のスレッドのすべての詳細をロードして、別のスレッドのキューに入れることをお勧めします。定期的に Sfile をロックし、すべての情報をダンプしてロックを解除する「監視」スレッドを使用することもできますが、「ダンプ」時間全体にわたって Sfile をロックしたままにします-そのオーバーヘッドは必要ないかもしれません-それはあなた次第です。
編集:
OH - 優先事項を忘れていました。OS スレッドの優先順位は、おそらくあなたの目的には役に立たないでしょう。各スレッドに優先度の enum/int を公開させ、「waitingThreads」配列をその優先度でソートしたままにして、優先度の高いスレッドに返されたファイルの最初のバイトを与えます。
宿題にはそれで十分ですか?