2010-08-11 2 views
1

класс подталкивание :: нить имеет конструктор по умолчанию, который дает «Не-а-нить», так чтоboost :: 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 продолжает расти в размерах. что происходит с этими потоками в завершенной группе и как я могу повторно использовать эти потоки и сохранить размер thread_group в 4?

я видел this question и вместо указанного выше кода используется следующим образом:

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(); 
} 

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

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

ответ

2

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

Смежные вопросы