嵌入式系统中一个生产者与多个消费者的疑问

时间:2021-03-16 19:23:53
介绍:在一个嵌入式系统中,一个线程在采集声音,然而有多个用户需要同时连接此服务器获取此音频数据。采用的tcp编程,那么,为了提高效率,应该如何构架程序呢?原来采用的是,用一个线程专门来发。将采集到的声音放到某buf中后,则分别发送到多个客户端,这样有个弊端,倘若某一路网络状况不好,就会影响以后的发送,send是阻塞的。后来又采用,给每个客户端单独开辟一个缓存队列,并创建多线程来发送。这样,当采集线程采集到声音的某个数据单元后,立刻将其拷贝到对应客户端的缓存区中,这样,发送时互不影响了。但是,拷贝严重影响性能。求高招!!!

16 个解决方案

#1


声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

#2


引用 1 楼 qq120848369 的回复:
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

有理

#3


用多播

#4


也可以考虑广播,取决于你的网络环境及负载。

#5


每个消息在队列中只需要保存一个指针,当这个消息需要“拷贝”时,你只要拷贝这个指针即可阿?

#6


广播!!!!

#7


引用 1 楼 qq120848369 的回复:
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

是这样的,生产线程在实时的采集音频数据,假设有四个线程向四个客户端发送音频数据。而待发送的数据在同一个BUFFER中。这样,线程1发送完了,应告诉生产者线程,新采集的数据可以往此BUFFER中放了,倘若此时线程2还用着呢?这样,互斥起来很麻烦。拷贝就省事多了,各发各个,互不影响,可惜性能不行。呵呵。

#8


引用 2 楼 qpx1125 的回复:
引用 1 楼 qq120848369 的回复:

声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

有理

同上。

#9


引用 3 楼 whg01 的回复:
用多播

此系统是供广域网上IP地址不同的多个客户同时使用的,广播应该是不行吧。组播以前没有研究过,在嵌入式系统中用起来麻烦不?

#10


用非阻塞的send能不能满足你的要求?

另外,关于多个消费者的

能不能再开一个数组,标记每个消费者已读的buffer

生产者只更新所有消费者都使用过的buffer

这样就不用锁了

#11


引用 7 楼 jiangong1987 的回复:
引用 1 楼 qq120848369 的回复:
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

是这样的,生产线程在实时的采集音频数据,假设有四个线程向四个客户端发送音频数据。而待发送的数据在同一个BUFFER中。这样,线程1发送完了,应告诉生产者线程,新采集的数据可以往此BUFFER……

那就先进先出的队列管理buffer,生产线程向队列里加buffer,四个线程都发完之后,再把buffer移出队列。
如果不嫌复杂,也可以用p2p网络。

#12


直接使用广播也得需要socket调用发送啊!
建议为每个链接开辟一个线程进行发送

#13


引用 11 楼 whg01 的回复:
引用 7 楼 jiangong1987 的回复:

引用 1 楼 qq120848369 的回复:
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

是这样的,生产线程在实时的采集音频数据,假设有四个线程向四个客户端发送音频数据。而待发送的数据在同一个BUFFER中。这样,线程1发送完……

现在就是这样做的,最主要的问题就是互斥。必须四个线程都不用一个buffer了,才可以从队列中删除,问题就在于,一路网络不好,迟迟不释放,会影响其它的线程对这个buffer的使用。此系统资源有限,一共才有四个buffer,所以很为难。

#14


引用 12 楼 jianwei824 的回复:
直接使用广播也得需要socket调用发送啊!
建议为每个链接开辟一个线程进行发送

互斥问题如何解决?

#15


引用 13 楼 jiangong1987 的回复:
引用 11 楼 whg01 的回复:
引用 7 楼 jiangong1987 的回复:

引用 1 楼 qq120848369 的回复:
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

是这样的,生产线程在实时的采集音频数据,假设有四个线程向四个客户端发送音频数据。而待发送的数据……

队列中有4个buffer,从buffer1到buffer4。生产者依次向buffer1、buffer2……buffer4中写入数据,buffer1被写满,就把buffer1的数据发送给所有的消费者。等所有的消费者都发送成功,将buffer1释放。从buffer1到buffer4循环使用。
如果4个buffer不够用,没有别的办法,要么加内存,要么让消费者之间互传数据,及采取bittorrent的p2p网络模式。

#16


组播吧

#1


声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

#2


引用 1 楼 qq120848369 的回复:
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

有理

#3


用多播

#4


也可以考虑广播,取决于你的网络环境及负载。

#5


每个消息在队列中只需要保存一个指针,当这个消息需要“拷贝”时,你只要拷贝这个指针即可阿?

#6


广播!!!!

#7


引用 1 楼 qq120848369 的回复:
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

是这样的,生产线程在实时的采集音频数据,假设有四个线程向四个客户端发送音频数据。而待发送的数据在同一个BUFFER中。这样,线程1发送完了,应告诉生产者线程,新采集的数据可以往此BUFFER中放了,倘若此时线程2还用着呢?这样,互斥起来很麻烦。拷贝就省事多了,各发各个,互不影响,可惜性能不行。呵呵。

#8


引用 2 楼 qpx1125 的回复:
引用 1 楼 qq120848369 的回复:

声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

有理

同上。

#9


引用 3 楼 whg01 的回复:
用多播

此系统是供广域网上IP地址不同的多个客户同时使用的,广播应该是不行吧。组播以前没有研究过,在嵌入式系统中用起来麻烦不?

#10


用非阻塞的send能不能满足你的要求?

另外,关于多个消费者的

能不能再开一个数组,标记每个消费者已读的buffer

生产者只更新所有消费者都使用过的buffer

这样就不用锁了

#11


引用 7 楼 jiangong1987 的回复:
引用 1 楼 qq120848369 的回复:
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

是这样的,生产线程在实时的采集音频数据,假设有四个线程向四个客户端发送音频数据。而待发送的数据在同一个BUFFER中。这样,线程1发送完了,应告诉生产者线程,新采集的数据可以往此BUFFER……

那就先进先出的队列管理buffer,生产线程向队列里加buffer,四个线程都发完之后,再把buffer移出队列。
如果不嫌复杂,也可以用p2p网络。

#12


直接使用广播也得需要socket调用发送啊!
建议为每个链接开辟一个线程进行发送

#13


引用 11 楼 whg01 的回复:
引用 7 楼 jiangong1987 的回复:

引用 1 楼 qq120848369 的回复:
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

是这样的,生产线程在实时的采集音频数据,假设有四个线程向四个客户端发送音频数据。而待发送的数据在同一个BUFFER中。这样,线程1发送完……

现在就是这样做的,最主要的问题就是互斥。必须四个线程都不用一个buffer了,才可以从队列中删除,问题就在于,一路网络不好,迟迟不释放,会影响其它的线程对这个buffer的使用。此系统资源有限,一共才有四个buffer,所以很为难。

#14


引用 12 楼 jianwei824 的回复:
直接使用广播也得需要socket调用发送啊!
建议为每个链接开辟一个线程进行发送

互斥问题如何解决?

#15


引用 13 楼 jiangong1987 的回复:
引用 11 楼 whg01 的回复:
引用 7 楼 jiangong1987 的回复:

引用 1 楼 qq120848369 的回复:
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.

为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.

是这样的,生产线程在实时的采集音频数据,假设有四个线程向四个客户端发送音频数据。而待发送的数据……

队列中有4个buffer,从buffer1到buffer4。生产者依次向buffer1、buffer2……buffer4中写入数据,buffer1被写满,就把buffer1的数据发送给所有的消费者。等所有的消费者都发送成功,将buffer1释放。从buffer1到buffer4循环使用。
如果4个buffer不够用,没有别的办法,要么加内存,要么让消费者之间互传数据,及采取bittorrent的p2p网络模式。

#16


组播吧