我们如何使用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();
}
}
但问题是如果我使用上面的代码然后它将只为que.size()创建线程 线程,但队列将有更多的新消息。
是否有任何方法可以动态地为每个新消息创建一个线程。像服务器套接字一样创建一个新的套接字来处理客户端请求。
答案 0 :(得分:4)
这似乎是线程池的一个好例子:预先创建了一组线程并准备好执行这些作业。
当收到新邮件时,应用程序会将其传递给线程池进行进一步处理,并立即开始等待下一条消息。
我可以在Codereview网站https://codereview.stackexchange.com/questions/36018/thread-pool-on-c11找到我之前做过的线程池实现。
答案 1 :(得分:3)
你应该考虑@Mankarse和@Jerry YY Rain评论。
但是如果你想继续你的方法,我考虑创建一个接收器线程,其唯一目的是在循环中观察队列(即在没有消息时挂起),以及何时新的如果消息到达,它应该创建一个新的工作线程并将消息传递给它。
这也可以简化您的同步,因为您只有一个阅读器,因此您不必担心两个线程是否已阅读相同的消息。
答案 2 :(得分:1)
我建议从线程池中获利。这样,您将拥有一些固定数量的线程来并行处理您的请求。线程池中的线程数量可能与计算机上的核心数相对应。 C ++中没有标准的线程池,但您可以轻松编写自己的(队列,线程组,互斥,条件变量),或从boost::asio::io_service中受益。 另请参阅this以获取参考实现。
为每个请求创建新线程可能非常昂贵。此外,由于上下文切换开销(当请求数量很大时),您可能无法获得更好的性能。