我有一个Web界面,用户提交一些数据并将其写入数据库。在后台有一个C ++程序,它定期检查数据库中的新条目。然后它接受这些条目,处理它们并将其结果写入目录。然后它继续睡眠并继续检查要处理的新条目。
我的问题是关于在C ++程序中添加多线程。我已经读过,每次需要完成另一个工作时创建一个新线程通常是一个坏主意,而是将这些作业添加到队列中并将它们分散到已经创建的固定数量的线程中(例如, 5左右)。这是适合我的情况的正确设计路线吗?此外,如果我正确理解pthread_join,我实际上不需要调用它,因为我不想等待所有作业完成,然后继续检查数据库的新更新。
我只是想确保我朝着正确的方向前进,任何肯定/批评/资源?
答案 0 :(得分: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使用说明,请参阅here。
答案 1 :(得分:1)
根据我的经验,创建一个线程很可能需要几十毫秒。对于你的日常电脑,这不是什么大不了的事。如果经常创建/销毁它将不会发生任何不好的事情。寻找简单而完美的应用程序级别设计可能更为重要。
作为一种可能的变体,我建议考虑一个线程池,每个可用CPU核心一个线程。这些线程应该只是在循环结束时休眠,并定期检查是否有事情要做。
这种简单的设计将增加最小的开销,并允许同时使用所有可用的CPU功率。
我的2美分。