2009-05-25 2 views
4

У меня есть несколько пулов потоков, и я хочу, чтобы мое приложение обрабатывало операцию отмены.C++ реализация отмена в пулах потоков

Для этого я реализовал объект контроллера общей операции, который я опросал в различных местах в каждой вызывающей функции рабочего потока потока.

Это хорошая модель, или есть лучший способ сделать это?

Я просто беспокоюсь о том, что все эти операцииController.checkState() засорены во всем коде.

ответ

4

Да, это хороший подход. Herb Sutter имеет nice article, сравнивая его с альтернативами (что хуже).

1

При любом виде синхронного аннулирования вам придется периодически опробовать какой-то флаг. Существует фундаментальная проблема того, что нужно держать вещи в согласном состоянии. Если вы просто убиваете нить посреди всего, что она делает, плохие вещи произойдут рано или поздно.

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

Если вам действительно нужно остановить операцию, вам нужно будет опросить в соответствующих точках и выполнить любую очистку.

1

Это хороший способ сделать это.

Другой возможный способ сделать это, если есть какая-либо другая подпрограмма [s], которую потоки регулярно называют в любом случае, чтобы проверить внутри этой подпрограммы и выбросить исключение (чтобы быть пойманным в верхней части потока), предполагая, что «Отменить» можно считать исключительным и предполагая, что код, выполняемый потоком, является безопасным для исключений.

1

Я не сделал бы этого так, проверяя общий объект.

Я, скорее всего, предоставит каждому потоку объект, чтобы отменить выполнение внутри собственного потока, будь то событие, переменная состояния потокобезопасности или что-то еще.

Проблема с контроллером совместного использования заключается в том, что с моей точки зрения логика отменяется, почему вы называете ее «контроллером», когда она ничего не контролирует?

Для меня контроллер операций должен получить заказ на отмену, а затем, в свою очередь, выбрать соответствующие потоки и сигнализировать им о прекращении. Это было бы правильной «цепочкой команд», если бы вы знали, что я имею в виду. То, как вы это делаете, вы вводите неестественное поведение в потоке, который не «подчиняется» ордерам останавливаться, а если проверяет каждый раз, если его «начальник» «написал порядок». Как-то это просто не так.

Кроме того, что, если вы просто один из «некоторых» потоков, чтобы остановиться в будущем? Что делать, если вы хотите включить некоторую расширенную логику, чтобы потоки перестали задавать условие? Затем вам придется переписать код в каждом потоке, чтобы обработать это условие.

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

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

0

В подобных ситуациях я использовал событие, не авто-сброс, все потоки могут смотреть на это событие.Совсем похоже на опрос, за исключением того, что если ваши потоки иногда блокируются, они могут спать и для «stop» -event. (Проще на Windows).

/L

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