1

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

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

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

4

2 回答 2

2

您应该首先决定是否需要多个线程——听起来就像检查数据库和在某个给定的时间间隔写入文件可以只使用一个线程来完成。当您开始不得不以不规则的时间间隔同时将不同的数据写入多个文件时,多线程将变得有用。您是正确的,使用各种队列是将这些“作业”分配给您的线程的最佳方式,并且使用线程池可以让您更好地控制您想要在任何给定的同时运行多少“作业”时间。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
}

有关 pthread/mutex/CV 使用说明,请参见此处

于 2012-07-31T00:03:04.613 回答
1

根据我的经验,创建一个线程很可能需要几十毫秒。对于您的计算机而言,这没什么大不了的。如果经常创建/销毁它,就不会发生任何不好的事情。寻找简单而完美的应用程序关卡设计可能更重要。

作为一种可能的变体,我建议考虑一个线程池,每个可用 CPU 内核一个线程。这些线程应该在循环结束时简单地休眠,并定期检查是否有事情要做。

这种简单的设计将增加最小的开销并允许同时使用所有可用的 CPU 功率。

我的 2 美分。

于 2012-07-30T23:51:37.057 回答