一个生产者+多消费者模型中的同步,共享内存
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 多线程操作共享内存生产者消费者模型多线程服务器框架