【问题标题】:Processing multiple files using child processes and Boost使用子进程和 Boost 处理多个文件
【发布时间】:2014-12-11 05:39:28
【问题描述】:

我是进程间通信的新手,正在寻找有关实现以下目标的最佳方法的输入和指导:我有一个将图像从一种格式转换为另一种格式的功能,我想要 使用多个进程进行批量图像转换。

  • 我有 1000 张图像要从一种格式转换为另一种格式
  • 我创建了 6 个子进程,并希望将图像文件名发送给它们进行处理:一个子一个图像要转换。

我应该简单地创建 6 个消息队列并向每个进程发送一个还是更好 创建一个存储图像名称向量的消息队列并将该向量发送到 6 个子进程?

如何将一个子进程的结果传回给父进程?以及如何在完成 1000 个文件之前继续向流程发送工作?

我正在使用 C++、Windows 和学习 Boost。

谢谢

杰夫

【问题讨论】:

    标签: c++ windows boost interprocess


    【解决方案1】:

    您需要多个进程还是可以使用具有多个线程的单个进程?这是一个多线程的解决方案(检查https://computing.llnl.gov/tutorials/pthreads/):

    1. 创建一个具有六个(或更多)工作线程的工作线程池。
    2. 启动线程。他们应该在互斥体上停止,等待条件。这 条件是:输入队列不为空。
    3. 将数据(例如图像句柄、文件名)加载到主线程上的输入队列 (同步其访问)并通知工作线程。
    4. 每个工作线程都应该访问队列并删除最后一个元素。你需要 同步访问队列。
    5. 当线程完成图像处理后,它应该存储处理后的数据(例如 转换后的图像句柄,文件名)在输出队列上(同样访问也应该同步)。
    6. 当输入队列为空且没有更多数据要添加时,作业完成。输出队列 具有所有已处理的图像数据。

    【讨论】:

    • 感谢 'fhsilva' 的回复。是的,我确实需要多个进程,因为文件转换使用了非线程安全的第 3 方库。这就是为什么我需要多个进程来解决线程安全问题的原因。您列出的方法似乎也适用于流程。我想知道是否有一些示例代码可以做到这一点,因为我想让进程保持忙碌,并且一旦处理完一张图像,就接收下一张要处理的图像。
    • 首先我建议您验证是什么使库不是线程安全的。也许您可以使用线程方法解决这个问题。请注意,如果库将某些内容写入文件系统,即使使用不同的进程,您也可能会遇到问题。除此之外,我建议您查看MSDN。还要检查这个有用的answer
    • 再次感谢。我没有 3rd 方库的源代码,所以我无法查看并尝试使其线程安全。
    • 我不是想让你修改库。我的意思是,如果你有一些文档可能表明哪些调用不是线程安全的,也许你可以在你的代码上使用同步来使你的线程正常工作。
    • 基本上,转换图像的调用本身不是线程安全的,所以如果我用互斥锁保护它,例如,我的程序将是简单的,因为转换图像的线程将锁定转换其他图片。
    猜你喜欢
    • 2016-11-16
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2016-10-23
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多