c++ - 在无尽的 C++ 程序中线程化

标签 c++ multithreading pthreads

我有一个网络界面,用户可以在其中提交一些数据并将其写入数据库。在后台有一个 C++ 程序定期检查数据库中的新条目。然后它获取这些条目,处理它们并将它们的结果写入目录。然后它继续休眠并继续检查要处理的新条目。

我的问题是关于向 C++ 程序添加多线程的。我读过,每次需要完成另一项工作时创建一个新线程通常是一个坏主意,而是将工作添加到队列中并将它们分散到已创建的固定数量的线程中(例如, 5 个左右)。这是适合我的情况的正确设计路线吗?此外,如果我正确理解 pthread_join,我实际上不需要调用它,因为我不想等待所有作业完成后再继续检查数据库的新更新。

我只是想确保我正朝着正确的方向前进,有任何肯定/批评/资源吗?

最佳答案

您应该首先决定您是否甚至需要多个线程——这听起来好像只使用一个线程就可以在某个给定的时间间隔内检查数据库和写入文件。当您开始不得不以非常规的时间间隔同时将不同的数据写入多个文件时,多线程将变得有用。您是正确的,使用排序队列是将这些“作业”分配给您的线程的最佳方式,并且使用线程池可以让您更好地控制在任何给定的同时运行多少个“作业”时间。 pthread_join 方法用于确保一个线程不会先于另一个线程退出 - 我主要使用它来确保程序的初始线程在创建线程池后不会退出,就像父线程退出时一样程序的执行停止。一些伪代码基于我在下面的评论。

主线程:

spawn child threads
while(some exit condition){
   check database for new jobs
   if(new jobs){
      acquire job queue mutex //mutexes ensures only one thread accesses shared 
      add job to queue        //data at a time
      signal on shared condition variable
      release job queue mutex 
   }
   sleep(some regular duration)
}

子线程:

while(some exit condition){
   acquire job queue mutex
   if(job queue's size == 0){
      wait on the shared condition variable
   }
   grab job from queue
   release job queue mutex
   handle job
}

参见 here用于 pthread/mutex/CV 使用说明。

关于c++ - 在无尽的 C++ 程序中线程化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11731173/

相关文章:

c++ - 获取 'name of the application' 以及按键

c++ - 一个 VS2010 错误?允许在没有警告的情况下绑定(bind)对右值的非常量引用?

multithreading - Delphi 线程 - 等待时卡住

c - 多任务如何让工作线程在调用无限循环函数后获得控制权

c++ - 转换和验证字符串

c++ - 带有负元素的OpenCV Mat的战俘

c++ - 如何在阻塞调用周围实现定时等待?

c# - 将项目添加到用于 Parallel.ForEach c# 的 ConcurrentBag

c++ - 如何安全地关闭线程?

c - 为什么 pthreads 的条件变量函数需要互斥量?