具有生产者/消费者模型的文件复制工具

时间:2012-10-25 05:41:36

标签: c++ synchronization file-copying consumer producer

所以我正在看我的下一个学校作业,我很困惑。我想我会找专家指点方向。我对同步的了解非常缺乏,而且我对它所引用的“mcopyfile”赋值没有这么热。可怕的可能是一个好词。如果我能就如何解决这个问题找到一些方向,我将不胜感激。不寻找某人完成我的任务,只需要有人指出我正确的方向。宝贝的步骤。

  

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

2 个答案:

答案 0 :(得分:1)

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

  1. 生产者即可。它根据源目录输入参数为使用者生成任务
  2. 任务即可。任务是 Consumer 执行其复制任务的信息。即源文件描述符和目标文件描述符的元组。
  3. 队列即可。它是 Producer Consumer 之间的核心通信。生产者将任务写入队列消费者使用它。
  4. 消费者即可。您有一组实际工作人员将任务作为输入并执行复制操作。
  5. 现在根据问题,为生产者生成一个线程,为消费者生成 n 线程。这就是线程的作用:

    • 制作人线程

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

      1. 虽然如此:
        1. 如果队列大小== 0:
          1. 睡了一段时间
        2. 否则:
          1. 获取队列
          2. 上的锁定
          3. 任务
          4. 出列
          5. 释放锁定队列
          6. 执行复制操作
          7. 获取 stdout
          8. 的锁定
          9. 写入 stdout
          10. 释放锁定 stdout

    我希望这会有所帮助。

答案 1 :(得分:0)

一旦您知道用于线程功能的API /库,您的作业就会非常简单。

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

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