如何实现多个线程写、一个线程读的队列,并且所有线程间不需要等待同步

来源:互联网 发布:2017mac 关机 快捷键 编辑:程序博客网 时间:2024/06/05 00:39
讨论切换线程的函数:
SwitchToThread(); // 切换到其他线程,即使其他线程优先级比自己低也会切换
sleep(0);// 切换到其他线程,只能切换到比自己优先级高或者同等优先级的线程,不会切换到低优先级线程。
首先设计一个一线程写一线程读的队列,拥有读写2个指针。
读线程:
1、首先判断读写指针,如果读指针==写指针,那么返回无数据,否则读取数据,然后读指针+1.
写线程:
1、(如果使用循环队列)写线程进入以后检查读写指针,如果读指针=写指针+1,那么写线程进入线程切换,直到读指针移动之后继续写入。(如果数据是允许丢弃的实时数据的话也可以不做判断);// 为了能原子操作数据,最好在循环队列里保存指针
2、写指针写入数据,并+1;
下面来考虑多个线程同时写时如何实现。
首先申请一个TLS值(建议使用运行库的,不要使用API,因为API一个进程最多只能申请255个,很容易用完)
然后每个线程保存一个上面实现的一线程读一线程写队列,同时把队列地址放在一个结构里保存;
每个写线程都把数据写到自己的线程拥有的队列里,每个数据需要同时保存一个时间计数(GetSystemTimeAsFileTime),用来判断各个队列中节点的先后顺序。
读线程依次遍历所有队列,把里面的值取出,并按照时间计数排列顺序处理。
具体代码等空闲时候再加上。
	
				
		
原创粉丝点击