一个生产者+多消费者模型中的同步,共享内存

Posted

技术标签:

【中文标题】一个生产者+多消费者模型中的同步,共享内存【英文标题】:Synchronization in one producer + multiple consumer model with shared memory 【发布时间】:2011-03-12 22:39:13 【问题描述】:

我想在 Unix 中使用共享内存实现一个生产者、多消费者模型生产者:将数据帧(~char[1024]) 放入内存段消费者:将数据memcpy到自己的私有内存中并做一些处理

一些相关信息:

    消费者可以错过一些数据帧 消费者是独立的,例如。如果一个消费者只得到数据 1,2,4,另一个消费者得到 2,3,5 也没关系 大约 10 个消费者将同时运行 生产者生成数据的速度比消费者处理数据的速度快 慢/僵尸消费者不应该减慢整个系统的速度 如果看到相同的数据,消费者将跳过 memcpy

我已经设置了共享内存的东西,并使用了 pthread 读写锁,但它似乎比使用 tcp 模型慢

我的问题:哪种同步最适合这种模型?

【问题讨论】:

“错过一些数据框”是什么意思?一个消费者得到 1,2,4 而另一个得到 2,3,5 究竟是怎么回事?你不介意 2 被处理两次吗? 我不认为这是一个同步问题。 (嗯,确实如此,但解决方案很少而且很简单。)这里更大的问题是调度。 我不确定你是否可以使用 .NET 库,但你需要类似于 ReaderWriterLockSlim 和 Related question 的东西 【参考方案1】:

您确定问题出在所使用的同步模型上吗?

我正在考虑其他事情:也许制作人“保留令牌”的时间过长。例如,生产者应该在私有内存中产生 1024 字节,并保留共享内存仅用于写入新数据?

确保关键部分尽可能小。

【讨论】:

以上是关于一个生产者+多消费者模型中的同步,共享内存的主要内容,如果未能解决你的问题,请参考以下文章

13.1 多线程操作共享内存生产者消费者模型多线程服务器框架

生产者消费者模型,管道,进程之间共享内存,进程池

如何避免可怕的中年危机?成功入职阿里

大厂面试必备:docker退出容器之后会不会保存

35 守护进程 互斥锁 IPC 共享内存 的方式 生产者消费者模型

Java面试题2020中高级,docker运行本地镜像