c++中使用std::thread创建动态线程
dynamic thread creation using std::thread in c++
如何使用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中获益。
为每个请求创建新线程可能非常昂贵。此外,由于上下文切换开销(当请求数量很大时),您可能无法获得更好的性能。
- 在线程 A 中创建一个 std::thread 对象,在线程 B 中连接
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- CLang:在 std::thread 中运行函数会导致结构创建BAD_ACCESS
- 创建 std::thread 时出现错误 C2280,未在 C++ 中初始化
- 在 std::thread 或 pthread_create 中创建的 QObject 的 QThreadData 是什
- 创建RSA_PrivateKey时对"std::thread::_State::~_State()"的未定义引用
- 在 std::thread 创建的线程中调用 pthread_sigmask 是一种好的做法吗?
- 这种创建带有指向实例的指针的分离 std::thread 的方式是错误的吗?
- 使用 make_shared<std::thread 创建 shared_ptr<std::thread> 的实例>
- 创建 std::thread c++11 时收到的 SIGABRT 信号
- 在linux下使用boost::thread创建一个boost::asio工作线程
- 如何使用boost::thread创建线程池
- 如何销毁由 std::thread 显式创建的线程
- 如何在C++(std::thread的子类)中正确创建线程类的子类
- C++ std::thread应该在堆或堆栈上创建
- 如何创建带有引用的函数指针的 std::thread
- 创建矢量<thread>
- std::thread::id 默认构造函数不应该创建一个"NULL" id吗?
- c++中使用std::thread创建动态线程
- C++11 延迟"thread"创建(即指定线程功能但不等待创建物理线程)