c++中使用std::thread创建动态线程

dynamic thread creation using std::thread in c++

本文关键字:thread 创建 动态 线程 std c++      更新时间:2023-10-16

如何使用std::thread创建动态线程。实际上,我正在从队列访问一些原始字符串,并且必须对其执行一些处理,并且队列有数千个这样的消息,因此我想为每个消息创建一个线程以提高性能。我可以使用下面的代码创建线程。

unsigned int n = std::thread::hardware_concurrency();
std::thread myThreads[n];
while(true)
{

    for (int i=0; i<n; i++){
        myThreads[i] = std::thread(&ControlQueue::processSomeStuff,this,msg_struct);
        }

//for joining
for (int i=0; i<n; i++){
    myThreads[i].join();
}
}

但问题是,如果我使用上面的代码,那么它只会为queue .size()创建线程线程,但是队列将有更多的新消息。

那么是否存在为每个新消息动态创建线程的方法呢?如服务器套接字创建一个新的套接字来处理客户端请求。

这看起来像是线程池的一个很好的例子:预先创建了一组线程,准备执行作业。

当收到一条新消息时,应用程序将其传递给线程池进行进一步处理,并立即开始等待下一条消息。

一个线程池的实现,我已经做了一段时间可以在这里找到https://codereview.stackexchange.com/questions/36018/thread-pool-on-c11在Codereview网站。

你真的应该考虑@Mankarse和@Jerry YY Rain的评论。

但是如果你想继续使用你的方法,我会考虑创建一个接收线程,其唯一目的是观察循环中的队列(即在没有消息时挂起),当有新消息到达时,它应该创建一个新的工作线程并将消息传递给它。

这也可以简化您的同步,因为您只有一个读取器,所以您不必担心两个线程是否读取了相同的消息。

我建议从线程池中获利。这样,您将有一些固定数量的线程并行处理您的请求。线程池中的线程数量可以对应于机器上的内核数量。c++中没有标准的线程池,但是您可以轻松地编写自己的线程池(队列、线程组、互斥锁、condition_variable),或者从boost::asio::io_service中获益。

为每个请求创建新线程可能非常昂贵。此外,由于上下文切换开销(当请求数量很大时),您可能无法获得更好的性能。