【发布时间】:2010-08-28 18:06:29
【问题描述】:
我正在尝试在 Visual C++ 中实现多线程、递归文件搜索逻辑。逻辑如下: 线程 1,2 将从目录位置开始,并将目录中存在的文件与搜索条件相匹配。如果他们找到子目录,他们会将其添加到工作队列中。一旦线程完成了目录中的文件,它就会从工作队列中获取另一个目录路径。工作队列是一个 STL Stack 类,由用于 push()、pop()、top() 调用的 CriticalSection 保护。
如果堆栈在任何时候为空,线程将在重试之前等待一分钟。同样当所有线程都处于等待状态时,搜索被标记为完成。
这个逻辑没有任何问题,但我觉得我没有获得使用线程的全部潜力,因为与使用单线程相比没有显着的性能提升。我觉得工作堆栈是瓶颈,但无法弄清楚如何消除锁定部分。我尝试了另一种变体,其中每个线程将拥有自己的堆栈,并且仅当本地堆栈大小超过固定数量的工作项时,才会将工作项添加到全局堆栈。如果本地堆栈为空,线程将尝试从全局队列中获取。即使有这种变化,我也没有发现明显的差异。有没有人有任何改进同步逻辑的建议。
问候,
【问题讨论】:
-
杰瑞,亨克,你们是对的。我按照 Jerry 的建议启动了 perfmon,“平均磁盘队列长度”图跳到 100,并在整个搜索过程中一直保持在那里。添加另一个线程有一点帮助的唯一原因是涉及到文件名比较。
标签: multithreading visual-c++ stl thread-safety critical-section