C++编程指南24 - 避免线程频繁的创建和销毁
一:概述
线程的创建和销毁是昂贵的操作,尤其在多线程程序中频繁创建和销毁线程时,可能会导致性能问题。
二:示例
这段代码中,dispatcher
每收到一个 Message
就创建一个新的线程来处理这个消息。这种方式虽然简单,但每次消息到来时都会进行线程创建和销毁,这样的操作非常昂贵,尤其是在高频繁消息处理时,性能会受到影响。
void worker(Message m)
{
// 处理
}
void dispatcher(istream& is)
{
for (Message m; is >> m; )
run_list.push_back(new thread(worker, m));
}
改进的方案是使用 线程池 或预先创建的一组工作线程来处理消息。具体来说,消息被放入一个同步队列 work
中,多个工作线程(如 4 个线程)会持续从队列中取出消息并进行处理,而不是为每个消息创建一个新线程。
通过这种方式,线程的创建和销毁的开销被最小化,系统的资源使用更加高效。线程池的好处是,线程可以被重复使用,避免了不断地创建和销毁线程,从而提高了系统的性能和可扩展性。
Sync_queue<Message> work;
void dispatcher(istream& is)
{
for (Message m; is >> m; )
work.put(m);
}
void worker()
{
for (Message m; m = work.get(); ) {
// 处理
}
}
void workers() // 设置工作线程(特别是 4 个工作线程)
{
joining_thread w1 {worker};
joining_thread w2 {worker};
joining_thread w3 {worker};
joining_thread w4 {worker};
}
三:总结
在高并发处理的场景中,线程池是非常常见的解决方案。