【问题标题】:C++ coordinating processes when launched?C++ 启动时协调进程?
【发布时间】:2013-07-07 11:14:28
【问题描述】:

使用 C++,我计划让一个 producer 进程写入数据 vector,然后几个 consumer 进程读取该数据。将有一个共享内存段(Boost::Interprocess)存储数据vector。问题是:我无法控制第三方应用程序启动进程的顺序,可能是consumer 可能在producer 产生任何数据之前启动。有哪些机制可用于协调进程,以便可以命令consumer 进程耐心等待,直到producer 发出数据准备好的信号;无论进程启动的顺序如何?

【问题讨论】:

    标签: c++ process launch


    【解决方案1】:

    我想命名信号量是一个不错的选择。您的生产者和消费者应用程序应该同意(硬编码)信号量的名称,例如 /tmp/mySem,只有生产者必须创建和发布信号量,而消费者应该等待信号量的存在和状态。

    【讨论】:

    • 谢谢。您能否按照您的建议快速举例说明如何设置和使用信号量?
    • 我在 Boost 文档中看到,当对信号量执行 post() 操作时,只会唤醒一个等待进程。如何唤醒所有等待的线程,要么一起唤醒,要么一个接一个?
    • 也许你应该使用条件变量同步 mchenizm 而不是信号量。可以将条件变量作为互斥锁创建为共享,然后您可以使用 broadcast() API 立即唤醒所有服务员。在 PTHREAD 库中,您需要查找 pthread_cond_init()、pthread_condattr_setpshared()、pthread_mutex_init() 和 pthread_cond_broadcast
    【解决方案2】:

    如果创建共享内存是生产者进程的责任,那么你可以使用boost屏障来同步启动。

    您可以创建一个屏障来创建共享内存,也许可以部署一些作业。达到此障碍后,消费者进程可以继续处理它们。

    你可以在page查看提升屏障的详细信息

    【讨论】:

    • 好的,我明白了;所以我需要在实例化时向 Barrier 对象提供要等待的进程数。该数字必须是硬编码还是由用户提供?瞧,如果程序可以使用更灵活的机制,它可以在没有用户交互的情况下处理任意数量的进程,那就太好了。
    猜你喜欢
    • 2021-01-26
    • 2014-08-10
    • 1970-01-01
    • 2020-04-12
    • 2017-12-11
    • 2021-02-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多