项目里多线程的问题

vcmaql 2008-07-06 10:47:25
一个程序,除了主线程外,还另开了两个线程.一个是读采集卡采得的数据写入文件,文件
大小固定,采满了又写入另一个文件,以此类推;另一个线程是分析采集的数据.该程序需
要持续运行几天.现在,问题是程序运行了几个小时后,就出现问题:采集线程不顺畅,从进
度条上看有时需要隔几秒才采下一包(本来应该70ms),由于系统实时性有要求,所以这样采
集到的数据就不对了.不知道这种现象是什么原因,是不是采集线程时间片结束后,去运行
系统某个别的线程去了,但是,我把采集线程的优先级提高,还是有这个问题,而且有时运
行一段时间后还出错.哪位高手给分析分析?
ps:采集线程必须持续运行,不能停止.
...全文
145 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoteng1984 2008-07-18
  • 打赏
  • 举报
回复
FILE + setvbuf
benjiam 2008-07-08
  • 打赏
  • 举报
回复
双缓存的做法吧,


写道一个队列里面去, 队列里面 再加个线程, 每过1 s看看。 每到1M 了 写一下盘。 性能会上去很多
vcmaql 2008-07-07
  • 打赏
  • 举报
回复
用perfmon监测了一把,确实在运行了一段时间后,磁盘写突然变慢,比较突然,不知道是怎么回事?是否是什么缓冲器或buffer满了?
vcmaql 2008-07-07
  • 打赏
  • 举报
回复
用perfmon监测了一下,确实是运行一段时间后,磁盘写数据变慢,但这种慢是比较突然的,之前还很正常,不知道是怎么回事。是不是跟缓冲区获什么buffer设置有关啊?
vcmaql 2008-07-07
  • 打赏
  • 举报
回复
用iostream试过了,发现这种方式读写文件很慢啊,满足不了我的要求。如果用FILE或者win32 api的话,是否需要用setbuf手工定义buffer大小呢?
renxianfu 2008-07-07
  • 打赏
  • 举报
回复
把采集数据和写文件这两个操作改为2个线程,开辟2个固定内存空间(双缓冲处理),一个线程负责采集数据,另一个写吧,应该能解决你的问题
既然是海量数据,机器采用多核
cppwin 2008-07-06
  • 打赏
  • 举报
回复
怀疑是因为磁盘IO阻塞了线程
vcmaql 2008-07-06
  • 打赏
  • 举报
回复
运行期间没有内存泄露现象
vcmaql 2008-07-06
  • 打赏
  • 举报
回复
1.不写磁盘可能不行.因为该项目就是一个大容量的海量存储.分析只是次要的.
2.我的写磁盘和数据处理就是两个线程.
3.我每写一包数据是512k,一个文件固定大小是169M,就是说每512k往文件里写,直到写到169M.
4.楼主说得添加方式写入是指什么?谢谢!
arong1234 2008-07-06
  • 打赏
  • 举报
回复
优化的考虑
1. 尽量不写磁盘
2. 如果要写磁盘,要把数据积累到1页(4096)的整数倍再写
3. 写磁盘的操作应该和数据处理操作在不同线程
4. 如果都无法满足,应该考虑RAID0或者RAID1+0磁盘
5. 还不行,要求必须是添加方式写入,且同一个物理磁盘不得用于其他目的(避免磁头被随机移走)
......
arong1234 2008-07-06
  • 打赏
  • 举报
回复
个人觉得处理中间不应该保存到磁盘上,一读一写白白浪费时间,应该等处理完了再写磁盘

但是从这些还看不出这种问题,你首先用perfmon观察一下你的磁盘使用情况,是否磁盘延时在持续上升,如果上升,才值得怀疑(观察PhysicalDisk\Averaged Queue Length, PhysicalDisk\Avg. Sec/Write, PhysicalDisk\Avg. sec/read也许可以看出结果

我觉得这个光靠现象是很难得到结论的。想办法记录你每个步骤的时间,看看到底哪个操作特别慢(例如定义几个计数器,看看采样、保存、处理一次的平均时间分别多少)

频繁写盘是非常有害的,尽量避免这么做。我记得有些好的服务器RAID磁盘的读写一次时间在5ms左右,有的慢的超过100ms,我估计你的磁盘读写速度应该没有5ms这一级别,那么它导致的磁盘损耗就非常可观了。

[Quote=引用 4 楼 vcmaql 的回复:]
我确实用的CFile.基于iostream的读写对象是指哪种?
[/Quote]
vcmaql 2008-07-06
  • 打赏
  • 举报
回复
我确实用的CFile.基于iostream的读写对象是指哪种?
Crob 2008-07-06
  • 打赏
  • 举报
回复
读写文件用的是什么对象?CFile?
用C++标准程序库中基于iostream的读写对象比较有保障一些。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧