создание динамического потока с использованием std :: thread в c ++

0

Как мы можем создавать динамические потоки, используя 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(), но в очереди появятся новые сообщения.

Итак, есть ли способ создания потока для каждого нового сообщения динамически. Подобный серверный сокет создает новый сокет для обработки запроса клиента.

  • 3
    Как вы думаете, почему создание потока для каждого из «тысяч сообщений» повысит производительность? Нитки очень дороги в создании.
  • 1
    для каждого сообщения мне приходится много обрабатывать, искать шаблон, конвертировать в xml, отправлять в файл и на другой сервер, поэтому, если я делаю все это последовательно, это занимает много времени для всех сообщений, поэтому я думаю о создании нескольких потоки, которые будут выполняться параллельно и сэкономить много времени выполнения, и у меня есть 2 ядра, и это может выполнять 4 потока параллельно.
Показать ещё 2 комментария
Теги:
multithreading
c++11
stdthread

3 ответа

4
Лучший ответ

Это похоже на хороший случай для пула потоков: набор потоков предварительно создан и готов к выполнению заданий.

Когда новое сообщение получено, приложение передает его в пул потоков для дальнейшей обработки и сразу же начинает ждать следующего сообщения.

Реализация пула потоков, которую я сделал некоторое время назад, можно найти здесь https://codereview.stackexchange.com/questions/36018/thread-pool-on-c11 на сайте Codereview.

3

Вы должны действительно рассмотреть комментарии @Mankarse и @Jerry YY Rain.

Но если вы хотите продолжить свой подход, я бы подумал о создании потока-получателя, единственной целью которого было бы наблюдать за очередью в цикле (т.е. зависать, когда нет сообщений), и когда приходит новое сообщение, оно должно создайте новый рабочий поток и передайте ему сообщение.

Это также может упростить вашу синхронизацию, так как у вас будет только один читатель, поэтому вам не придется беспокоиться, прочитали ли два потока одно и то же сообщение.

  • 0
    да, но я проверил время процессора, создав потоки, подобные приведенному выше коду, это действительно увеличило мою производительность, и каждую секунду тысячи новых сообщений будут приходить в очередь.
1

Я бы предложил получить прибыль от пула потоков. Таким образом, у вас будет определенное количество потоков, которые обрабатывают ваши запросы параллельно. Количество потоков в пуле потоков может соответствовать количеству ядер на вашем компьютере. В C++ нет стандартного пула потоков, но вы можете легко написать свои собственные (очередь, группа потоков, мьютексы, condition_variable) или воспользоваться boost :: asio :: io_service. См. Также это для справочной реализации.

Создание нового потока для каждого запроса может быть очень дорогостоящим. Кроме того, вы можете не получить более высокую производительность из-за чрезмерных затрат на переключение контекста (когда количество запросов велико).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню