0

所以我正在查看我的下一个学校作业,我很困惑。我想我会向专家寻求一些指导。我严重缺乏同步方面的知识,而且我对它所指的“mcopyfile”任务也没有那么热情。可怕的可能是一个好词。如果我能就如何解决这个问题获得一些指导,将不胜感激。不是找人来做我的任务,只需要有人给我指出正确的方向。婴儿步骤。

基于您在 Lab 2 中创建的多线程文件复制工具(mcopyfile),现在请使用工作池(Producer-Consumer 模型)实现,该实现使用固定数量的线程来处理负载(无论在要复制的目录)。您的程序应创建 1 个文件复制生产者线程和多个文件复制消费者线程(此数字取自命令行参数)。文件复制生产者线程将在有界大小的缓冲区结构中生成(源和目标)文件描述符列表。每次生产者访问缓冲区时,它将写入一个(源,目标)文件条目(每次访问)。并且所有的文件复制消费者线程都会从这个缓冲区中读取,执行实际的文件复制任务,并删除相应的文件条目(每个消费者每次都会消费一个条目)。生产者和消费者线程都会向标准输出写入一条消息,给出文件名和完成状态(例如,对于生产者:“正在完成将文件 1 放入缓冲区”,对于消费者:“正在完成将文件 1 复制到……”)。

4

2 回答 2

1

假设您知道如何生成线程,让我为您分解问题。有以下组件:

  1. 制片人。它根据源目录输入参数为消费者生成任务。
  2. 任务。任务是消费者执行其复制任务的信息。即源文件描述符和目标文件描述符的元组。
  3. 排队它是ProducerConsumer之间通信的核心部分。生产者将任务写入队列消费者使用它。
  4. 消费者。您有一个以Task作为输入并执行复制操作的实际工作人员池。

现在根据问题,为生产者生成一个线程,为消费者生成n 个线程。这就是线程的作用:

  • 生产者线程

    1. 对于源目录中的文件列表:
      1. 任务<-(源文件路径,目标文件路径)
      2. 获取队列上的锁
      3. 将任务写入队列
      4. 释放队列上的锁
      5. 获取标准输出上的锁定
      6. 写入标准输出
      7. 释放标准输出上的锁定
  • 消费者线程

    1. 真时:
      1. 如果队列大小 == 0:
        1. 睡一段时间
      2. 别的:
        1. 获取队列上的锁
        2. 队任务
        3. 释放队列上的锁
        4. 执行复制操作
        5. 获取标准输出上的锁定
        6. 写入标准输出
        7. 释放标准输出上的锁定

我希望这有帮助。

于 2012-10-25T06:08:32.347 回答
0

一旦您知道您将用于线程功能的 API/库,您的分配对我来说看起来很简单。

首先,您将解析命令行参数并创建指定数量的线程,然后从主线程获取文件夹中的文件列表并开始将它们放入共享的数组(如 std::vector)中在线程之间并与互斥锁(或 Windows 上的关键部分)同步。每当一个消费者线程获得互斥体时,它都会复制数组中的文件条目,从数组中删除该条目,释放互斥体以便另一个线程可以开始做同样的事情,并开始复制由它从数组中删除的条目。

我会给你一些代码片段,但你没有说你使用什么 API/库来实现线程功能。

于 2012-10-25T06:12:12.170 回答