Как прервать ожидание C++ 0x поток?

Я рассматриваю для использования C++ 0x потоки в моем приложении вместо потоков Повышения. Однако я не уверен, как повторно реализовать то, что у меня есть со стандартным C++ 0x потоки, так как они, кажется, не имеют interrupt() метод.

Моя текущая установка:

  • основной поток, который справляется с работой;
  • несколько рабочих потоков, которые выполняют команды ведущего устройства.

Рабочие звонят wait() по крайней мере на двух различных условных переменных. У ведущего устройства есть "приведенное к таймауту" состояние: в этом случае это говорит всем рабочим останавливать и давать безотносительно результата, который они получили к тому времени. С ведущим устройством потоков Повышения просто использует interrupt_all() на группе потока, которая заставляет рабочих прекращать ожидать. В случае, если они не ожидают в данный момент, ведущее устройство также устанавливает a bool флаг, который рабочие периодически проверяют.

Однако в C++ 0x std::thread Я не вижу замены для interrupt(). Я пропускаю что-то? В противном случае, как я могу реализовать вышеупомянутую схему так, чтобы рабочие не могли просто спать навсегда?

9
задан James McNellis 29 May 2010 в 22:39
поделиться

2 ответа

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

void th(Interruptor& interruptor) {
  try {

    ...

    while (cnd1.timed_wait(d)==false) {
      interruptor.check_interruption_point();
    }
    ...
  } catch (interrupted_exception &) {}
}

Класс Interruptor будет поддерживать логическую переменную, защищенную мьютексом или атомарными операциями, если они есть, и две функции прерывают и check_interruption_point, которые при вызове interrupted_exception, если логическое значение истинно. Поток Mater создаст переменную Interruptor, которая будет передана соответствующим потокам во время создания. Мастер имеет возможность прерывать сразу все потоки, которые зависят от данного прерывателя. Конечно, вы можете создать прерыватель для каждого потока, если вы хотите явно прерывать один поток за раз.

Вам нужно определить продолжительность по времени ожидания,таким образом, ваши потоки могут реагировать, как только этого потребует ваша программа.

10
ответ дан 4 December 2019 в 14:27
поделиться

Wait boost делает в interrupt(), чтобы выдать notify_all при условии, что поток в данный момент заблокирован, а затем проверить, не было ли запрошено прерывание. Если было запрошено прерывание, выполняется бросок boost::thread_interrupted. Вы можете написать свою тему класс на основе std::thread с механизмом.

2
ответ дан 4 December 2019 в 14:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: