我正在尝试在Visual C++中实现多线程,递归文件搜索逻辑。逻辑如下:
线程1,2将在目录位置开始,并将目录中存在的文件与搜索条件进行匹配。如果找到子目录,则将其添加到工作队列。线程完成目录中文件的处理后,它将从工作队列中获取另一个目录路径。工作队列是一个STL Stack类,由CriticalSections保护着,用于push(),pop(),top()调用。
如果堆栈在任何时候都为空,则线程将等待一分钟,然后重试。同样,当所有线程都处于等待状态时,搜索将标记为完成。
这种逻辑可以正常工作,但是我觉得我没有充分利用线程的潜力,因为与使用单线程相比,并没有显着的性能提升。我觉得工作堆栈是瓶颈,但无法弄清楚如何取消锁定部分。我尝试了另一个变体,其中每个线程将具有其自己的堆栈,并且仅当本地堆栈大小超过固定数量的工作项时,才会将工作项添加到全局堆栈中。如果本地堆栈为空,则线程将尝试从全局队列中获取。即使有这种变化,我也没有发现明显的区别。有没有人对改善同步逻辑有任何建议?
问候,
最佳答案
我真的怀疑您的工作堆栈是否是瓶颈。磁盘只有一个磁头,一次只能读取一个数据流。只要您的线程以磁盘可以提供的最快速度处理数据,那么您可以执行的其他操作就不会对整体速度产生重大影响。
对于其他类型的任务,您的队列可能会成为严重的瓶颈,但是对于此任务,我对此表示怀疑。请记住此处操作的时间范围。在CPU内部进行的简单操作所花费的时间不到一纳秒。从主存储器的读取大约需要数十纳秒。诸如线程切换或同步之类的过程大约需要数百纳秒的时间。磁盘驱动器上的单个磁头移动大约需要毫秒(1,000,000纳秒)。
关于multithreading - 多个线程之间的数据访问同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3591851/