先发送int大小的数据,指明后面的数据流长度,再接着发送真正的数据流。客户端阻塞的先收int大小数据,再按该数据阻塞的收数据流。
这个地方是不是不太适合用select之类的I/O复用模型,因为我感觉I/O服用其实也是放在一个线程内进行读写的,只不过何时读写应该是由内核通知的,这样的理解对吗?
所以我感觉是不是这里用线程模型比较好,每个用户一个线程,但是这些线程怎么获取流化的数据,用锁吗?那是不是效率太低点,比如我流化的数据进入的回调函数,平均每40ms触发一次,难道要在回调的函数里
void callback(char *data,int data_size)
{
//读锁住data
for ( int i = 0 ; i < 线程总数 ; i ++ )
{
线程[i] 操作data;
}
//读锁释放data
}
12 个解决方案
#1
按照你阻塞模型,有数据头,多客户端, 一个客户端一个线程,没错。效率是很低。至于你什么时候开始循环发送随你。
#2
多谢楼上的答复
我想确定下 这种模型是不是不太适合select这样的模型 因为我这些TCP应该都是长连接的
还有 我想问下 如果这种模式发送的很慢 数据处理的比数据产生的还要慢 会产生什么现象
比如 外面的调用函数 每40毫秒调用一次callback,但是callback要50毫秒才返回,这时,是不是外面的调用函数就出问题了?
我想确定下 这种模型是不是不太适合select这样的模型 因为我这些TCP应该都是长连接的
还有 我想问下 如果这种模式发送的很慢 数据处理的比数据产生的还要慢 会产生什么现象
比如 外面的调用函数 每40毫秒调用一次callback,但是callback要50毫秒才返回,这时,是不是外面的调用函数就出问题了?
#3
你设个存储流数据的队列。各个连接线程发完了就去队列里取。
#4
都是读数据,多个线程并发访问没有问题。
问题是阻塞方式,性能上是个问题。客户端数量少还好,数量大的话,最好是异步模型。好歹上个select模式
问题是阻塞方式,性能上是个问题。客户端数量少还好,数量大的话,最好是异步模型。好歹上个select模式
#5
楼上的 太谢谢你的回复了
我争取马上结贴
你说的这个 我可以做一个队列来试试
这个队列应该是不断的有新数据进入 旧数据被删除吧
但是每个线程 怎么读数据呢
比如 队列里的数据是
d1 d2 d3 .... dn
线程A取数据取到d2了 线程B取到d1 还有线程C,线程D等
那我怎么决定什么时候删除数据块d1呢?
我争取马上结贴
你说的这个 我可以做一个队列来试试
这个队列应该是不断的有新数据进入 旧数据被删除吧
但是每个线程 怎么读数据呢
比如 队列里的数据是
d1 d2 d3 .... dn
线程A取数据取到d2了 线程B取到d1 还有线程C,线程D等
那我怎么决定什么时候删除数据块d1呢?
#6
每个连接线程里各有个队列=。=
#7
你的回调就循环往队列里添加
#8
楼上的 谢谢你
你的意思 是把原来的数据源,也就是一个视频文件流化后的数据源复制多份,分别往每个线程的队列里插入吗
你的意思 是把原来的数据源,也就是一个视频文件流化后的数据源复制多份,分别往每个线程的队列里插入吗
#9
你可以不复制多分,用智能指针,把你流数据的指针,和大小。封装个消息或者结构体加到各个线程队列里即可。
简单点就复制多份吧。就是内存大点。
简单点就复制多份吧。就是内存大点。
#10
好的 结贴了 多谢
#11
楼上的 用智能指针行吗
每个线程播放完自己队里里的数据 都会删除队列前的数据 如果有不同步的情况
那不是会出现线程A删除了线程B要用的数据?
每个线程播放完自己队里里的数据 都会删除队列前的数据 如果有不同步的情况
那不是会出现线程A删除了线程B要用的数据?
#12
你搜索下智能指针的使用目的就会明白的。 智能指针也不需要你亲自去delete,多个人使用一个流数据,只有最后一个人用完了才自动的delete
#1
按照你阻塞模型,有数据头,多客户端, 一个客户端一个线程,没错。效率是很低。至于你什么时候开始循环发送随你。
#2
多谢楼上的答复
我想确定下 这种模型是不是不太适合select这样的模型 因为我这些TCP应该都是长连接的
还有 我想问下 如果这种模式发送的很慢 数据处理的比数据产生的还要慢 会产生什么现象
比如 外面的调用函数 每40毫秒调用一次callback,但是callback要50毫秒才返回,这时,是不是外面的调用函数就出问题了?
我想确定下 这种模型是不是不太适合select这样的模型 因为我这些TCP应该都是长连接的
还有 我想问下 如果这种模式发送的很慢 数据处理的比数据产生的还要慢 会产生什么现象
比如 外面的调用函数 每40毫秒调用一次callback,但是callback要50毫秒才返回,这时,是不是外面的调用函数就出问题了?
#3
你设个存储流数据的队列。各个连接线程发完了就去队列里取。
#4
都是读数据,多个线程并发访问没有问题。
问题是阻塞方式,性能上是个问题。客户端数量少还好,数量大的话,最好是异步模型。好歹上个select模式
问题是阻塞方式,性能上是个问题。客户端数量少还好,数量大的话,最好是异步模型。好歹上个select模式
#5
楼上的 太谢谢你的回复了
我争取马上结贴
你说的这个 我可以做一个队列来试试
这个队列应该是不断的有新数据进入 旧数据被删除吧
但是每个线程 怎么读数据呢
比如 队列里的数据是
d1 d2 d3 .... dn
线程A取数据取到d2了 线程B取到d1 还有线程C,线程D等
那我怎么决定什么时候删除数据块d1呢?
我争取马上结贴
你说的这个 我可以做一个队列来试试
这个队列应该是不断的有新数据进入 旧数据被删除吧
但是每个线程 怎么读数据呢
比如 队列里的数据是
d1 d2 d3 .... dn
线程A取数据取到d2了 线程B取到d1 还有线程C,线程D等
那我怎么决定什么时候删除数据块d1呢?
#6
每个连接线程里各有个队列=。=
#7
你的回调就循环往队列里添加
#8
楼上的 谢谢你
你的意思 是把原来的数据源,也就是一个视频文件流化后的数据源复制多份,分别往每个线程的队列里插入吗
你的意思 是把原来的数据源,也就是一个视频文件流化后的数据源复制多份,分别往每个线程的队列里插入吗
#9
你可以不复制多分,用智能指针,把你流数据的指针,和大小。封装个消息或者结构体加到各个线程队列里即可。
简单点就复制多份吧。就是内存大点。
简单点就复制多份吧。就是内存大点。
#10
好的 结贴了 多谢
#11
楼上的 用智能指针行吗
每个线程播放完自己队里里的数据 都会删除队列前的数据 如果有不同步的情况
那不是会出现线程A删除了线程B要用的数据?
每个线程播放完自己队里里的数据 都会删除队列前的数据 如果有不同步的情况
那不是会出现线程A删除了线程B要用的数据?
#12
你搜索下智能指针的使用目的就会明白的。 智能指针也不需要你亲自去delete,多个人使用一个流数据,只有最后一个人用完了才自动的delete