-1

nPOSIX スレッドを使用して、スレッドが異なる優先度で実行されるプログラムを作成したいと考えています。

これらのスレッドm間で共有されるファイル (たとえばファイル) があります。n1 つのスレッドがファイルを使用している場合 (ファイルに書き込みを行っていると仮定)、他のスレッドはそのファイルを使用できません。コードは、取得したファイルとその要求が保留中のファイルを示すテーブルを維持する必要があります。

また、デッドロックをチェックするためにモニター スレッドが必要です。実装のヒント/アイデアはありますか?

4

3 に答える 3

1

デッドロックをチェックする必要はありません。デッドロック シナリオに陥らないようにする適切なコードを作成する必要があります。そのため、try-lock アプローチを使用して一連のファイルをロックし、ロックの取得が失敗した場合にロックを解除することをお勧めします。

ftrylockfileまた、C バッファ I/O を使用している場合は、funlockfile APIを使用することをお勧めします。それ以外の場合は、futex API やアトミック命令を使用して実装されたロックなど、ケースに最も適した同期メカニズムを使用してください。

于 2012-10-18T19:37:46.930 に答える
1

これを実現するための標準的な UNIX の方法は、spooldirectories です。

  • 名前の変更/リンク/リンク解除などのファイル操作はアトミックです
  • 入力ファイルを配置できる中央入力スプールディレクトリが 1 つある
  • a process / thread that wants to process a file, starts by moving it to another name, or better: to another (work) directory (using the thread_id or process number as directory name is obvious.)
  • (since this move is atomic there is no possible race condition!)
  • after processing, the finished files can be moved to an output directory
  • the scoreboard function is simply a readdir(+stat), maybe even inotify, on the work directories
  • process starvation will always be a problem. Incompletely processed files will live forever in de workdirs. Having a stamp/ pid file in the workdirectories could help cleanup / restart.
  • if designed well, this structure could work even after machine failure. The workers would have to maintain their own backup / log /stamp-file mechanism.
  • if you haven't noticed yet: no locking will be needed.
于 2012-10-18T22:29:45.027 に答える
0

私は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」配列をその優先度でソートしたままにして、優先度の高いスレッドに返されたファイルの最初のバイトを与えます。

宿題にはそれで十分ですか?

于 2012-10-18T20:37:52.487 に答える