您的位置:程序门 -> vc/mfc -> 进程/线程/dll



关于多个线程共用同一list的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于多个线程共用同一list的问题
发表于:2007-07-12 10:30:50 楼主
现有一个很大的xml数据文件,我打算在程序启动时就开启一个线程,将此文件里所有的数据都装入一个list(stl   里的list)里边,然后会有若干个线程访问list获取数据,同时启动时开启的那个线程定时监控文件是否被更改了,如果更改了就重新load.

我现在想的是监控线程在更新list时加锁,其它访问线程不加锁,这样可以最快速度读取数据.但是我担心在监控线程更新list时,会与其它线程有冲突.

请给出一个最好的解决方案.
发表于:2007-07-12 10:37:481楼 得分:0
up
发表于:2007-07-12 12:38:372楼 得分:0
昏,使用内核对象让监控线程锁定操作了,那么其它想不锁定都难。
发表于:2007-07-12 12:40:103楼 得分:0
其它线程上就要在必要的时候进行同步,禁止load的时候进行访问。那都在被迫的去锁定了
发表于:2007-07-12 13:14:084楼 得分:0
sendmessage可以解决问题
加一个updatelistdata消息,list控件显示刷新,每个线程如果有数据insert   list,则向list窗体sendmessage(hwnd,updatelistdata.....);
发表于:2007-07-12 15:04:115楼 得分:0
我认为如果锁定这个list是可以接受的话,就那样做就可以了.但如果你一定要追求最好的性能的话,你可以参考windows的完成端口的原理来做:
1.将外部多线程对该list的读写请求放到一个异步队列中.
2.外部的多线程监视异步队列的返回结果队列.
3.异步队列里面来组织对list的读写并且按要求将结果返回到结果队列中.在异步队列里面,你完全可以只需要极少的锁来减少冲突.比如:先处理所有的读后再去处理写,当发现队列里面根本没写的请求时完全不用去锁定任何东西大家自由的读;当要写时若发现有读的请求则先处理完读的请求再写.
以上描述可能不太清楚.但windows的i/o完成端口模型绝对是一个性能极高的解决方案.楼主可以参考之.


快速检索

最新资讯
热门点击