C++ C语言中的快速生产者/慢速消费者

C++ C语言中的快速生产者/慢速消费者,c++,c,linux,unix,C++,C,Linux,Unix,我用C编写了一个等待事件的程序,然后通过system()函数运行一个外部系统命令 while( true ){ wait_for_event(); system("cmd"); } 我在这方面有一个严重的问题,cmd是一个繁重的命令,需要几秒钟才能完成,我的应用程序在此时间范围内错过了一些事件 因此,我决定将非常重的系统功能移到另一个程序中,因此我对程序进行了如下更改: while( true ){ wait_for_event(); write_to_fifo

我用C编写了一个等待事件的程序,然后通过
system()
函数运行一个外部系统命令

while( true ){
    wait_for_event();
    system("cmd");
}
我在这方面有一个严重的问题,
cmd
是一个繁重的命令,需要几秒钟才能完成,我的应用程序在此时间范围内错过了一些事件

因此,我决定将非常重的
系统
功能移到另一个程序中,因此我对程序进行了如下更改:

while( true ){
    wait_for_event();
    write_to_fifo("cmd");
}
并编写了另一个程序:

while(true){
    system(read_from_pipe());
}
但这并没有帮助,因为若生产者(第一个程序)比消费者(第二个程序)写得快,消费者就会丢失一些数据


有什么方法可以解决这个问题吗?

如果您只需要事件的数量,那么您可以拥有一个全局计数器。为了避免竞争条件,您可能需要使用信号灯。当然,您需要有两个线程


由于您的事件包含重要事件,因此可以使用列表(或具有足够数量插槽的数组)来存储传入数据。您可以使用互斥锁来保护此列表。

您应该将代码返回到其原始形式-即,单个程序调用第二个程序-除非您将
系统(3)
调用替换为
popen(3)
调用。现在,调用程序可以将用于事件检查的调用与从外部程序读取的行交错

Unix管道机制确保当管道满时,慢速使用者将导致快速生产者在写入时等待


您可能还希望查看
fileno(3)
函数,结合
select(2)
poll(2)
,使外部程序的读取异步,这样它就永远不会阻止调用程序。

您可以使用,和其他系统调用

您可能需要一个事件循环。您可以使用syscall(或者类似的事件循环库,它使用
poll


我强烈建议在编写代码之前花几个小时阅读一篇文章。

使用一个线程捕获事件,将它们添加到队列中,并让您的消费者从该队列中取出。是否可以使用多个线程来减轻消费者的负担,同时让生产者使用单线程?诚然,这是一场失败的战斗,但考虑到您的需求,这足以拯救您。如果数据存储对于额外的线程来说仍然太多,那么您还应该查看它。如何设置管道?当然,如果你不断地得到比你能处理的更多的数据,就会有一些东西“给予”。但完全可以使用管道缓慢地处理大量数据。否则,做
cat myprog.c | gcc-o myprog
-是行不通的-gcc有时相当慢,cat会尽可能快地推到管道上。我喜欢Falmari的建议。您可能需要研究Posix MQUE。MQUE非常快速且易于使用。另一种可能是提速队列,但速度要慢得多。如果可以,请使用MQUE。感谢您的及时回复。我不熟悉linux下的C编程,请给出示例代码。谢谢你真的应该买一本关于这个话题的书。一件一件地学习它是有道理的,但是有一种格式塔你需要学习,只有当你在短时间内学习了很多的时候才会发生。我推荐W.Richard Stevens在Unix环境2/e中进行高级编程。还有其他类似的书。不要被这本书的时代所淘汰。即使是第一版对现代Linux编程也有95%的实用性。内核API和C标准库在这段时间内没有太大变化。不,事件有一些重要的数据,它们应该被处理并存储在其他地方。