0

それで私は次の学校の課題を見ていました、そして私は困惑しています。ある方向で専門家のところに来ると思いました。同期に関する私の知識はひどく不足しており、それが参照する「mcopyfile」の割り当てについてはそれほど熱心ではありませんでした。ひどいことはおそらくそれのための良い言葉でしょう。この問題をどのように達成するかについて何らかの方向性を得ることができれば、それは大いにありがたいです。私の任務を遂行する人を探しているのではなく、正しい方向に私を向けてくれる人が必要です。赤ちゃんのステップ。

ラボ2で作成したマルチスレッドファイルコピーツール(mcopyfile)に基づいて、負荷を処理するために固定数のスレッドを使用するワーカープール(生産者/消費者モデル)の実装を使用してください(ファイルの数に関係なく)コピーするディレクトリ)。プログラムは、1つのファイルコピープロデューサースレッドと複数のファイルコピーコンシューマースレッドを作成する必要があります(この数はコマンドライン引数から取得されます)。ファイルコピープロデューサースレッドは、制限されたサイズのバッファー構造で(ソースと宛先の)ファイル記述子のリストを生成します。プロデューサーがバッファーにアクセスするたびに、1つの(ソース、宛先)ファイルエントリを(訪問ごとに)書き込みます。そして、すべてのファイルコピーコンシューマスレッドはこのバッファから読み取り、実際のファイルコピータスクを実行します。対応するファイルエントリを削除します(各コンシューマーは毎回1つのエントリを消費します)。プロデューサースレッドとコンシューマースレッドの両方が、ファイル名と完了ステータスを示すメッセージを標準出力に書き込みます(たとえば、プロデューサーの場合:「file1をバッファーに入れています」、コンシューマーの場合:「file1のコピーを完了しています…」)。

4

2 に答える 2

1

スレッドを生成する方法を知っていると仮定して、問題を分解させてください。次のコンポーネントがあります。

  1. プロデューサー。ソースディレクトリの入力パラメータに基づいて、コンシューマ用のタスクを生成します。
  2. タスク。タスクは、コンシューマーがコピータスクを実行するための情報です。つまり、ソースファイル記述子と宛先ファイル記述子のタプルです。
  3. キューこれは、プロデューサーコンシューマーの間のコミュニケーションの中心的な部分です。プロデューサーはタスクキューに書き込み、コンシューマーはそれを消費します。
  4. 消費者タスクを入力として受け取り、コピー操作を実行する実際のワーカーのプールがあります。

質問に従って、プロデューサー用のスレッドとコンシューマー用のnスレッドを生成します。そして、これはスレッドが行うことです:

  • プロデューサースレッド

    1. ソースディレクトリ内のファイルのリスト:
      1. タスク<-(ソースファイルパス、宛先ファイルパス)
      2. キューのロックを取得する
      3. キューにタスクを書き込む
      4. キューのロックを解除します
      5. stdoutのロックを取得する
      6. stdoutに書き込む
      7. stdoutのロックを解除します
  • コンシューマースレッド

    1. 真実である間:
      1. キューのサイズ==0の場合:
        1. しばらく寝る
      2. そうしないと:
        1. キューのロックを取得する
        2. タスクをデキューします
        3. キューのロックを解除します
        4. コピー操作を実行する
        5. stdoutのロックを取得する
        6. stdoutに書き込む
        7. stdoutのロックを解除します

これがお役に立てば幸いです。

于 2012-10-25T06:08:32.347 に答える
0

スレッド機能に使用するAPI/ライブラリがわかれば、割り当ては非常に簡単に見えます。

まず、コマンドライン引数を解析して指定された数のスレッドを作成します。次に、メインスレッドからフォルダー内のファイルのリストを取得し、共有される配列(std :: vectorなど)に配置し始めます。スレッド間で、ミューテックス(またはWindowsのクリティカルセクション)と同期されます。コンシューマースレッドの1つがミューテックスを取得するたびに、配列内のファイルエントリのコピーを作成し、そのエントリを配列から削除し、ミューテックスを解放して別のスレッドが同じことを開始できるようにし、で表されるファイルのコピーを開始します。配列から削除されたエントリ。

いくつかのコードスニペットを提供しますが、スレッド機能に使用しているAPI/ライブラリについては言及していません。

于 2012-10-25T06:12:12.170 に答える