【问题标题】:File Copy Tool w/ Producer/Consumer Model带有生产者/消费者模型的文件复制工具
【发布时间】:2012-10-15 06:20:10
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    • 生产者线程

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

      1. 正确时:
        1. 如果队列大小 == 0:
          1. 睡一会儿
        2. 其他:
          1. 获取 队列上的锁定
          2. 出列任务
          3. 释放 队列上的锁定
          4. 执行复制操作
          5. 获取 stdout 上的锁定
          6. 写入标准输出
          7. 释放 stdout 上的锁定

    我希望这会有所帮助。

    【讨论】:

    • 也可以理解分配,以便生产者读取源文件并生成用于写入(部分)目标文件的任务。
    • @SimonRichter,这来自 OP 的问题:The file copy producer thread will generate a list of (source and destination) file descriptors in a buffer structure
    • 是的,我想是的,我计划在今天的某个时候开始。感谢您的快速响应!
    • Vikas,我已经为这个作业发布了一些代码,并且收到了一个段错误,如果问得不多,我会对你对代码的意见和评估感兴趣:) stackoverflow.com/questions/13148673/…跨度>
    【解决方案2】:

    一旦你知道你将使用什么 API/库来实现线程功能,你的任务对我来说就很简单了。

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-20
      • 1970-01-01
      • 2018-11-17
      • 2013-06-14
      • 1970-01-01
      • 2015-09-22
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多