2013-09-25 1 views
2

Я использую boost и пытаюсь создать базовую thread_group, которая будет выполнять свои задачи и выйти. Вот что мой код выглядит следующим образом:boost thread_group бесконечный цикл

boost::thread_group threads; 
void InputThread() 
{ 
    int counter = 0; 

    while(1) 
    { 
     cout << "iteration #" << ++counter << " Press Enter to stop" << endl; 

     try 
     { 
      boost::this_thread::sleep(boost::posix_time::milliseconds(500)); 
     } 
     catch(boost::thread_interrupted&) 
     { 
      cout << "Thread is stopped" << endl; 
      return; 
     } 
    } 
} 

int main() 
{ 
    int iterator; 
    char key_pressed; 
    boost::thread t[NUM_THREADS]; 

    for(iterator = 0; iterator < NUM_THREADS; iterator++) 
    { 
     threads.create_thread(boost::bind(&InputThread)) ; 
     cout << "iterator is: " << iterator << endl; 

      // Wait for Enter to be pressed  
     cin.get(key_pressed); 

     // Ask thread to stop 
     t[iterator].interrupt(); 

    } 
    // Join all threads 
    threads.join_all(); 

    return 0; 
} 

Я начал с двумя нитями и падения в бесконечном цикле после того, как обе нити сделаны с их рабочих мест. Что-то вроде ниже:

iterator is: 0 
iteration #1 Press Enter to stop 
iteration #2 Press Enter to stop 

iterator is: 1 
iteration #1 Press Enter to stop 
iteration #3 Press Enter to stop 
iteration #2 Press Enter to stop 

iteration #4 Press Enter to stop 
iteration #3 Press Enter to stop 
iteration #5 Press Enter to stop 
iteration #4 Press Enter to stop 
iteration #6 Press Enter to stop 
iteration #5 Press Enter to stop 
iteration #7 Press Enter to stop 
^C 

Где я иду не так?

ответ

1

Отношение между вашим boost::thread t[] и boost::thread_group threads;.

So t[iterator].interrupt(); не оказывает влияния на резьбу, порожденную threads.create_thread(boost::bind(&InputThread)) ;.

Вместо делать:

std::vector<boost::thread *> thread_ptrs; 
// ... 

    thread_ptrs.push_back(threads.create_thread(boost::bind(&InputThread))); 

    // ... 

    thread_ptrs[iterator].interrupt(); 

Помимо: название «итератор» часто используется для типов и делает плохое значение для перебора. Используйте i или другое идиоматическое имя для этого значения.

+0

Спасибо, что решает проблему. Однако мне нужно лучше понять thread_group. –

+0

@ user2816953 Если вы удовлетворены ответом, пожалуйста, поддержите и/или примите ответ соответственно. –

+0

Я уже принял ответ, но до сих пор не хватает репутации для продвижения. Я только что подписался на два дня назад. Когда я доберусь туда, я верну вам вашу благодарность за ответ, проголосовав :) –