写者、读者的安全与效率有关问题

写者、读者的安全与效率问题
各位大侠,目前我正在处理这样一个项目。

软件内部不断在接收数据,接收的数据目前用来保存、转发以及其他几个方面处理。
目前,将前者作为写线程,后者作为读线程。

由于写线程与读线程之间不能同时进行,写线程与写线程之间不能同时进行,读线程与读线程之间则可以同步进行。
如果采用一个类似于CriticalSection或者Mutex,每次仅仅允许一个线程对共享数据操作,则降低效率。

我觉得应该采用信号量Semaphore,而且要配合其他线程同步方法使用。

具体如何使用,请各位兄台指点迷津。

该问题,虽然类似于生产者、消费者。但是由于消费者本身对数据并不做修改,而是仅仅读取,所以从解决方案上来说,应该采用读者、写者模型,而不是采用生产者、消费者模型策略。

至于如何采用线程同步变量,来实现既能保证读写共享数据区域安全、又能保证读共享数据区域的高效,请各位大侠给予指点。

------解决方案--------------------
同读信号量,同写信号量,读写互斥,先标记一下。
------解决方案--------------------
用读写锁

搜到一篇
http://blog.csdn.net/querw/article/details/7214925
------解决方案--------------------
你表述的,恰是一个读写锁的应用场景。

如果消费者并不取走数据,那么,你实际上在一个片刻内只有一个数据,新数据会替换上一个数据,如果是这样,就是读写锁,而不是信号量。信号量能表示事件的个数,而你的需求是每一个时刻至多只存在一个事件。
------解决方案--------------------
探讨

引用:
你表述的,恰是一个读写锁的应用场景。

如果消费者并不取走数据,那么,你实际上在一个片刻内只有一个数据,新数据会替换上一个数据,如果是这样,就是读写锁,而不是信号量。信号量能表示事件的个数,而你的需求是每一个时刻至多只存在一个事件。

我不是这个意思。读者、写者的共享数据区域为一个内存缓冲区。

------解决方案--------------------
你在写和读之间加个链表撒。在第一个节点之后,就可以出现读写并发了。至与节点大小就看你的读写速度了,最理想的是读和写一样快
------解决方案--------------------
如果允许缓冲区分割,读写就可以同时进行了。但是你要保证读和写的区域不在同一个区块(每个区块可称为一帧),而且读和写之间会有至少一帧的延迟。
------解决方案--------------------
楼主所描述的是 共享读互斥写 的过程. 
在DELPHI的源代码里面, 有一个叫TShareReadExcludeWrite的对象(名字大概是这个), 在那个Asyn???的单元里面的, 这个就是 共享读互斥 写的 原子锁对象. 能够完全实现楼主描述的功能, 而且还是高手写的代码, 非常简洁, 可以参考或者照搬.
------解决方案--------------------
我做类似的东西从不限制读
在写的同时读唯一可能出问题的地方就是读正在写的东西
且不说这么巧的事发生概率低
就算是发生了也不一定会读出错
即便出错了做一个容错判断也就过去了
然后你要处理的就是写同步的问题了
这个没什么好说的
同一时间对同一资源只能一个线程操作
但是考虑效率
可以对资源细分
也就是说
一个线程可以写从0地址到0x40的位置
而此时如果有一个线程想操作0x50到0x100的数据那就让他去操作好了