multithreading - 多个线程之间的数据访问同步

标签 multithreading visual-c++ stl thread-safety critical-section

我正在尝试在Visual C++中实现多线程,递归文件搜索逻辑。逻辑如下:
线程1,2将在目录位置开始,并将目录中存在的文件与搜索条件进行匹配。如果找到子目录,则将其添加到工作队列。线程完成目录中文件的处理后,它将从工作队列中获取另一个目录路径。工作队列是一个STL Stack类,由CriticalSections保护着,用于push(),pop(),top()调用。

如果堆栈在任何时候都为空,则线程将等待一分钟,然后重试。同样,当所有线程都处于等待状态时,搜索将标记为完成。

这种逻辑可以正常工作,但是我觉得我没有充分利用线程的潜力,因为与使用单线程相比,并没有显着的性能提升。我觉得工作堆栈是瓶颈,但无法弄清楚如何取消锁定部分。我尝试了另一个变体,其中每个线程将具有其自己的堆栈,并且仅当本地堆栈大小超过固定数量的工作项时,才会将工作项添加到全局堆栈中。如果本地堆栈为空,则线程将尝试从全局队列中获取。即使有这种变化,我也没有发现明显的区别。有没有人对改善同步逻辑有任何建议?

问候,

最佳答案

我真的怀疑您的工作堆栈是否是瓶颈。磁盘只有一个磁头,一次只能读取一个数据流。只要您的线程以磁盘可以提供的最快速度处理数据,那么您可以执行的其他操作就不会对整体速度产生重大影响。

对于其他类型的任务,您的队列可能会成为严重的瓶颈,但是对于此任务,我对此表示怀疑。请记住此处操作的时间范围。在CPU内部进行的简单操作所花费的时间不到一纳秒。从主存储器的读取大约需要数十纳秒。诸如线程切换或同步之类的过程大约需要数百纳秒的时间。磁盘驱动器上的单个磁头移动大约需要毫秒(1,000,000纳秒)。

关于multithreading - 多个线程之间的数据访问同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3591851/

相关文章:

asp.net - 使用 Mdbg 的 ASP.NET 的基于 Web 的堆栈转储工具?

multithreading - 有没有办法在 Rust 中生成具有指定生命周期的线程?

c++ - 任意大小的枚举值

c++ - 迭代器在C++内部如何工作?

visual-studio-2008 - VS2008 -> VS2010 导致神秘的 STL 错误

c++ - 当我使用 vector::erase 时它崩溃的原因可能是什么?

C#线程,多个线程调用相同的方法访问同一个数组会导致速度变慢吗?

c++ - ZMQ 导致主线程卡住(或类似的东西..?)

最近的 MSVC 中的 C++ 模板解析错误,GCC、LLVM 和较旧的 MSVC 正常

visual-c++ - Visual C++ 中是否有 X64 固有的 8 位原子 CAS (cmpxchg)?