16 个解决方案
#1
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.
为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.
为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.
#2
有理
#3
用多播
#4
也可以考虑广播,取决于你的网络环境及负载。
#5
每个消息在队列中只需要保存一个指针,当这个消息需要“拷贝”时,你只要拷贝这个指针即可阿?
#6
广播!!!!
#7
是这样的,生产线程在实时的采集音频数据,假设有四个线程向四个客户端发送音频数据。而待发送的数据在同一个BUFFER中。这样,线程1发送完了,应告诉生产者线程,新采集的数据可以往此BUFFER中放了,倘若此时线程2还用着呢?这样,互斥起来很麻烦。拷贝就省事多了,各发各个,互不影响,可惜性能不行。呵呵。
#8
同上。
#9
此系统是供广域网上IP地址不同的多个客户同时使用的,广播应该是不行吧。组播以前没有研究过,在嵌入式系统中用起来麻烦不?
#10
用非阻塞的send能不能满足你的要求?
另外,关于多个消费者的
能不能再开一个数组,标记每个消费者已读的buffer
生产者只更新所有消费者都使用过的buffer
这样就不用锁了
另外,关于多个消费者的
能不能再开一个数组,标记每个消费者已读的buffer
生产者只更新所有消费者都使用过的buffer
这样就不用锁了
#11
那就先进先出的队列管理buffer,生产线程向队列里加buffer,四个线程都发完之后,再把buffer移出队列。
如果不嫌复杂,也可以用p2p网络。
#12
直接使用广播也得需要socket调用发送啊!
建议为每个链接开辟一个线程进行发送
建议为每个链接开辟一个线程进行发送
#13
现在就是这样做的,最主要的问题就是互斥。必须四个线程都不用一个buffer了,才可以从队列中删除,问题就在于,一路网络不好,迟迟不释放,会影响其它的线程对这个buffer的使用。此系统资源有限,一共才有四个buffer,所以很为难。
#14
互斥问题如何解决?
#15
队列中有4个buffer,从buffer1到buffer4。生产者依次向buffer1、buffer2……buffer4中写入数据,buffer1被写满,就把buffer1的数据发送给所有的消费者。等所有的消费者都发送成功,将buffer1释放。从buffer1到buffer4循环使用。
如果4个buffer不够用,没有别的办法,要么加内存,要么让消费者之间互传数据,及采取bittorrent的p2p网络模式。
#16
组播吧
#1
声音存储在全局BUFFER里,每个客户用一个线程去发这个全局BUFFER,反正是只读的.
为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.
为什么非要将声音拷贝给每个客户的缓存呢,出于什么考虑.
#2
有理
#3
用多播
#4
也可以考虑广播,取决于你的网络环境及负载。
#5
每个消息在队列中只需要保存一个指针,当这个消息需要“拷贝”时,你只要拷贝这个指针即可阿?
#6
广播!!!!
#7
是这样的,生产线程在实时的采集音频数据,假设有四个线程向四个客户端发送音频数据。而待发送的数据在同一个BUFFER中。这样,线程1发送完了,应告诉生产者线程,新采集的数据可以往此BUFFER中放了,倘若此时线程2还用着呢?这样,互斥起来很麻烦。拷贝就省事多了,各发各个,互不影响,可惜性能不行。呵呵。
#8
同上。
#9
此系统是供广域网上IP地址不同的多个客户同时使用的,广播应该是不行吧。组播以前没有研究过,在嵌入式系统中用起来麻烦不?
#10
用非阻塞的send能不能满足你的要求?
另外,关于多个消费者的
能不能再开一个数组,标记每个消费者已读的buffer
生产者只更新所有消费者都使用过的buffer
这样就不用锁了
另外,关于多个消费者的
能不能再开一个数组,标记每个消费者已读的buffer
生产者只更新所有消费者都使用过的buffer
这样就不用锁了
#11
那就先进先出的队列管理buffer,生产线程向队列里加buffer,四个线程都发完之后,再把buffer移出队列。
如果不嫌复杂,也可以用p2p网络。
#12
直接使用广播也得需要socket调用发送啊!
建议为每个链接开辟一个线程进行发送
建议为每个链接开辟一个线程进行发送
#13
现在就是这样做的,最主要的问题就是互斥。必须四个线程都不用一个buffer了,才可以从队列中删除,问题就在于,一路网络不好,迟迟不释放,会影响其它的线程对这个buffer的使用。此系统资源有限,一共才有四个buffer,所以很为难。
#14
互斥问题如何解决?
#15
队列中有4个buffer,从buffer1到buffer4。生产者依次向buffer1、buffer2……buffer4中写入数据,buffer1被写满,就把buffer1的数据发送给所有的消费者。等所有的消费者都发送成功,将buffer1释放。从buffer1到buffer4循环使用。
如果4个buffer不够用,没有别的办法,要么加内存,要么让消费者之间互传数据,及采取bittorrent的p2p网络模式。
#16
组播吧