Я рассматриваю для использования C++ 0x потоки в моем приложении вместо потоков Повышения. Однако я не уверен, как повторно реализовать то, что у меня есть со стандартным C++ 0x потоки, так как они, кажется, не имеют interrupt()
метод.
Моя текущая установка:
Рабочие звонят wait()
по крайней мере на двух различных условных переменных. У ведущего устройства есть "приведенное к таймауту" состояние: в этом случае это говорит всем рабочим останавливать и давать безотносительно результата, который они получили к тому времени. С ведущим устройством потоков Повышения просто использует interrupt_all()
на группе потока, которая заставляет рабочих прекращать ожидать. В случае, если они не ожидают в данный момент, ведущее устройство также устанавливает a bool
флаг, который рабочие периодически проверяют.
Однако в C++ 0x std::thread
Я не вижу замены для interrupt()
. Я пропускаю что-то? В противном случае, как я могу реализовать вышеупомянутую схему так, чтобы рабочие не могли просто спать навсегда?
К сожалению, я не вижу другого способа, кроме опроса, вместо использования ожидания используйте время ожидания и переменной, чтобы указать, что прерывание было сделано.
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, которая будет передана соответствующим потокам во время создания. Мастер имеет возможность прерывать сразу все потоки, которые зависят от данного прерывателя. Конечно, вы можете создать прерыватель для каждого потока, если вы хотите явно прерывать один поток за раз.
Вам нужно определить продолжительность по времени ожидания,таким образом, ваши потоки могут реагировать, как только этого потребует ваша программа.
Wait boost делает в interrupt(), чтобы выдать notify_all при условии, что поток в данный момент заблокирован, а затем проверить, не было ли запрошено прерывание. Если было запрошено прерывание, выполняется бросок boost::thread_interrupted. Вы можете написать свою тему класс на основе std::thread с механизмом.