window下编程,关于实时处理海量数据衍生的面试题!

modicum_lf 2011-08-23 11:26:02
现在在Windows下编程,是实时处理海量数据的要求,这时性能有较高的要求。现在的问题是这样的:

一个线程A产生数据,累积到一定数量后交给线程B去后续处理(例如写盘什么的),其实是满简单的一个需求了,我就开辟了2个buffer,我的想法是先让A获得第一个buffer的控制权,然后线程B再去等第一buffer控制权,当第一个buffer写满后,线程A释放第一个buffer的控制权,再去获得第二的buffer的控制权。线程B获得第一个buffer的控制权后处理数据,然后释放第一个buffer的控制权,再去等第二个buffer的控制权。以此交替。

我可以采用EnterCriticalSection,LeaveCriticalSection来解决这个同步,但是问题是,当A线程对buffer操作时,如果B也在等同一个buffer的控制权,这时候B是不是一直在内核模式和用户模式下切换,耗费资源非常大?有没有其他合理的办法。

因为程序中很多对这样的线程,我的目标要求是:
当A线程操作完成后,通知B,B在获得控制权前应该是"休眠"状态,不太耗费资源。对windows下的多线程了解不多,不知道那种同步互斥方式做合适我的应用。谢谢!!!!
...全文
103 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackyjkchen 2011-08-24
  • 打赏
  • 举报
回复
我觉得可以维护一个写盘队列,写盘用一个线程就够了,毕竟瓶颈在磁盘IO
jackyjkchen 2011-08-24
  • 打赏
  • 举报
回复
你用的临界区是纯用户态的,没有内核级切换

SRWLock用法类似临界区,效率又稍高一些,推荐使用
luciferisnotsatan 2011-08-24
  • 打赏
  • 举报
回复
现在还有插PCI-E槽上的硬盘。

如果你的B线程里还有很多处理逻辑,处理完后才写硬盘。你可以把写独立出来。
iambic 2011-08-24
  • 打赏
  • 举报
回复
现成的queue有都是。别自己山寨了。
talentzxf 2011-08-24
  • 打赏
  • 举报
回复
如果数据不是很重要丢了也无所谓的话,可以考虑用 ramdisk的。 读写速度和内存一样快(其实就是内存)
luciferisnotsatan 2011-08-24
  • 打赏
  • 举报
回复
磁盘IO的想好比线程切换(CPU)上的消耗大多了。
有钱就上固态硬盘,没钱就买企业级的高速机械盘。RAID0模式是必须的
pathuang68 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jackyjkchen 的回复:]

我觉得可以维护一个写盘队列,写盘用一个线程就够了,毕竟瓶颈在磁盘IO
[/Quote]

++
俺也这么认为滴。大型数据库的想硬盘写,也就是一个线程而已。

这类问题的性能瓶颈绝大部分情况下都在硬盘的IO性能,所以如果要提高性能的通常要采用磁盘阵列技术,比如RAID0模式下,如果有10块硬盘,那么理论上IO的性能就可能是1块硬盘的10倍。

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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