boost :: thread и создание пула из них! - PullRequest
2 голосов
/ 11 августа 2010

boost :: thread класс имеет конструктор по умолчанию, который дает "Not-a-thread", так что же такое

boost::thread t1;

хорошо для? Могу ли я дать ему функцию для выполнения позже в коде?

и еще один вопрос:

Я пытаюсь написать небольшой сервер с поэтапной архитектурой (SEDA), на каждом этапе есть несколько рабочих потоков, и этапы связаны с очередями событий. когда я создаю пул с 4 рабочими потоками, используя boost :: thread_group следующим образом: (Я удалил условную переменную в очереди, чтобы очистить ее, а также предполагая, что размер очереди всегда равен 4N.)

boost::thread_group threads;
while(!event_queue.empty())
{
    for(int i = 0; i < 4; ++i)
    {
        threads.create_thread(event_queue.front());
        event_queue.pop();
    }

    threads.join_all();
}

группа потоков продолжает увеличиваться в размере. что происходит с теми потоками в группе, которые закончили и как я могу повторно использовать эти потоки и сохранить размер thread_group равным 4?

я видел этот вопрос и вместо приведенного выше кода использовал это:

std::vector<boost::shared_ptr<boost::thread>> threads;
while(!event_queue.empty())
{
    for(int i = 0; i < 4; ++i)
    {
        boost::shared_ptr<boost::thread> 
            thread(new boost::thread(event_queue.front());
        event_queue.pop();
        threads.push_back(thread);
    }

    for(int i = 0; i < 4; ++i)
        threads[i]->join();

    threads.clear();
}

так в чем же разница, и какая из них имеет лучшую производительность? Будет ли утечка памяти? или есть другой способ создать простой пул потоков?

Буду признателен за любую помощь. Большое спасибо.

1 Ответ

2 голосов
/ 25 ноября 2010

Один из вариантов - использовать boost asio.Посмотрите на рецепт для пула потоков: http://think -async.com / Asio / Recipes .Затем вы публикуете события в пуле потоков, используя метод post io_service.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...