c++ - 没有互斥锁的基于模数的负载平衡?

标签 c++ multithreading pthreads large-files bigdata

我可能做错了,但这是我的问题和建议的解决方案:

您有一个超过 50 GB 的文件,其中包含数亿条需要快速处理的独立记录。我当前的解决方案是每小时获取 7400 万条记录。我正在为 I/O 线程使用阻塞队列,每个工作线程都试图从该队列中获取数据 block 。

由于 I/O 和工作线程之间的互斥锁争用,上述过程非常慢。

有没有办法在没有锁的情况下实现这种风格的生产者/消费者?

最佳答案

与其使用阻塞队列并让工作线程从中提取数据,不如为每个线程提供自己的队列,并让 I/O 线程将成批工作推送到每个线程的队列中。

如果您不介意花额外的精力来实现某种方式来跟踪可以将多少项目插入每个队列,那么循环队列对此非常有用;如果 I/O 线程读取新记录的速度快于工作线程处理它们的速度,则必须小心不要覆盖未处理的记录。

确保记录不被覆盖的一种方法是让工作线程每隔一段时间发送一条消息,以更新 I/O 线程已处理的记录数。这种方法不需要锁定;只有一个原子操作来经常更新 I/O 线程。

除此之外,您还可以通过使用非阻塞 I/O 在将最后一批数据插入队列时读取更多记录来获得更好的性能。它还有助于了解瓶颈是磁盘访问还是处理。

关于c++ - 没有互斥锁的基于模数的负载平衡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5885348/

相关文章:

c++ - C++中的Pthread取消

c - Pthread - 设置调度程序参数

c++ - 返回一个Type,或者如何保存一个对象指针的类型?

c - 手册页在线程安全上发生冲突

python - "GUI becomes unresponsive after clicking the button"

c# - Label.Text = Struct.Value (Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException)

linux - 我应该在 clone(2) 中设置什么标志,以便它与 pthread_create() 一样工作?

c++ - 在 Qt 中使用 $HOME

c++ - 如何从另一个类访问 main 中定义的类的对象

c++ - 用于对象检测的 OpenCV .xml 文件复制