04 July 2023

C++ 核心指南目录

“Minimize thread creation and destruction”

理由

线程创建成本高。

例子

void worker(Message m)
{
    // process
}

void dispatcher(istream& is)
{
    for (Message m; is >> m; )
        run_list.push_back(new thread(worker, m));
}

这段代码给每一个消息生成一个线程。任务完成后, run_list 会销毁线程。

其实我们可以用让一组创建好的工作线程来处理消息。

Sync_queue<Message> work;

void dispatcher(istream& is)
{
    for (Message m; is >> m; )
        work.put(m);
}

void worker()
{
    for (Message m; m = work.get(); ) {
        // process
    }
}

void workers()  // set up worker threads (specifically 4 worker threads)
{
    joining_thread w1 {worker};
    joining_thread w2 {worker};
    joining_thread w3 {worker};
    joining_thread w4 {worker};
}

注意

如果你的系统有很好的线程池,尽量用起来。如果你的系统有很好的消息队列,尽量用起来。