如何实现多个线程写,一个线程读的队列,并且所有线程
1个回答
2017-12-17 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517181
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
首先设计一个一线程写一线程读的队列,拥有读写2个指针。
读线程:
1、首先判断读写指针,如果读指针==写指针,那么返回无数据,否则读取数据,然后读指针+1.
写线程:
1、(如果使用循环队列)写线程进入以后检查读写指针,如果读指针=写指针+1,那么写线程进入线程切换,直到读指针移动之后继续写入。(如果数据是允许丢弃的实时数据的话也可以不做判断); // 为了能原子操作数据,最好在循环队列里保存指针
2、写指针写入数据,并+1;
下面来考虑多个线程同时写时如何实现。
首先申请一个TLS值(建议使用运行库的,不要使用API,因为API一个进程最多只能申请255个,很容易用完)
然后每个线程保存一个上面实现的一线程读一线程写队列,同时把队列地址放在一个结构里保存;
每个写线程都把数据写到自己的线程拥有的队列里,每个数据需要同时保存一个时间计数(GetSystemTimeAsFileTime),用来判断各个队列中节点的先后顺序。
读线程依次遍历所有队列,把里面的值取出,并按照时间计数排列顺序处理。
读线程:
1、首先判断读写指针,如果读指针==写指针,那么返回无数据,否则读取数据,然后读指针+1.
写线程:
1、(如果使用循环队列)写线程进入以后检查读写指针,如果读指针=写指针+1,那么写线程进入线程切换,直到读指针移动之后继续写入。(如果数据是允许丢弃的实时数据的话也可以不做判断); // 为了能原子操作数据,最好在循环队列里保存指针
2、写指针写入数据,并+1;
下面来考虑多个线程同时写时如何实现。
首先申请一个TLS值(建议使用运行库的,不要使用API,因为API一个进程最多只能申请255个,很容易用完)
然后每个线程保存一个上面实现的一线程读一线程写队列,同时把队列地址放在一个结构里保存;
每个写线程都把数据写到自己的线程拥有的队列里,每个数据需要同时保存一个时间计数(GetSystemTimeAsFileTime),用来判断各个队列中节点的先后顺序。
读线程依次遍历所有队列,把里面的值取出,并按照时间计数排列顺序处理。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询