точки прерывания и чистый выход - PullRequest
1 голос
/ 31 октября 2011

См. Следующий код:

boost::thread_group threads;
boost::barrier      barrier(10);
thing               pThing;

for( size_t i = 0; i < 10; ++i )
{
    threads.create_thread(
        [&barrier, &pThing]()
        {
            while( true )
            {
                // do some stuff with pThing
                if( barrier.wait() )    //  let all threads catch up before resettings, and only 1 thread resets
                    pThing.Reset();
                barrier.wait();         //  let all threads wait until the reset is completed
            }
        });
}

threads.join_all();

Вопросы:

  1. Нужен ли способ прерывания while (true) для корректного выхода из потоков?
  2. Завершится ли join_all(), поскольку все потоки имеют бесконечный цикл?
  3. что происходит, когда поток завершает свою работу, он умирает?
  4. Является ли barrier.wait() точкой прерывания ?
  5. Есть ли точки прерывания просто дать нить?
  6. Что происходит, когда группа нитей умирает; Мне даже нужно join_all(), если группа потоков все равно умрет сразу после этого?

1 Ответ

1 голос
/ 31 октября 2011
  1. Нет, вы также можете завершить поток за исключением. Исключение прерывания - это чистый способ сделать это.
  2. Выпуск interrupt_all() Сначала позвоните.
  3. Да, возобновление невозможно.
  4. Да.
  5. Я не понимаю вашего вопроса. Точка прерывания - это точка, в которой я прерываюсь? флаг проверяется, и если это правда, генерируется исключение. interrupt() вызов устанавливает этот флаг в потоке и, кроме того, заставляет поток перестать ждать, если это то, что он делает в данный момент.
  6. Насколько я понимаю, потоки продолжают существовать, то есть их не заставляют умирать. Вы должны убедиться, что потоки завершают работу (что по сути зависит от того, какой код выполняются вашими потоками), затем join_all() и только после этого уничтожаете объект группы потоков.
...