Как мы можем создавать динамические потоки, используя 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(), но в очереди появятся новые сообщения.
Итак, есть ли способ создания потока для каждого нового сообщения динамически. Подобный серверный сокет создает новый сокет для обработки запроса клиента.
Это похоже на хороший случай для пула потоков: набор потоков предварительно создан и готов к выполнению заданий.
Когда новое сообщение получено, приложение передает его в пул потоков для дальнейшей обработки и сразу же начинает ждать следующего сообщения.
Реализация пула потоков, которую я сделал некоторое время назад, можно найти здесь https://codereview.stackexchange.com/questions/36018/thread-pool-on-c11 на сайте Codereview.
Вы должны действительно рассмотреть комментарии @Mankarse и @Jerry YY Rain.
Но если вы хотите продолжить свой подход, я бы подумал о создании потока-получателя, единственной целью которого было бы наблюдать за очередью в цикле (т.е. зависать, когда нет сообщений), и когда приходит новое сообщение, оно должно создайте новый рабочий поток и передайте ему сообщение.
Это также может упростить вашу синхронизацию, так как у вас будет только один читатель, поэтому вам не придется беспокоиться, прочитали ли два потока одно и то же сообщение.
Я бы предложил получить прибыль от пула потоков. Таким образом, у вас будет определенное количество потоков, которые обрабатывают ваши запросы параллельно. Количество потоков в пуле потоков может соответствовать количеству ядер на вашем компьютере. В C++ нет стандартного пула потоков, но вы можете легко написать свои собственные (очередь, группа потоков, мьютексы, condition_variable) или воспользоваться boost :: asio :: io_service. См. Также это для справочной реализации.
Создание нового потока для каждого запроса может быть очень дорогостоящим. Кроме того, вы можете не получить более высокую производительность из-за чрезмерных затрат на переключение контекста (когда количество запросов велико).