Как заменить во время выполнения WaitHandle, что поток должен ждать - PullRequest
0 голосов
/ 18 февраля 2011

Мне интересно, как безопасно изменить во время выполнения EventWaitHandle, что поток должен ждать.

Предположим, например, что есть два потока (A и C), которые синхронизируются через EventWaitHandles. A выполняет свою работу циклически, а C ожидает, пока не получит уведомление от A о том, что он может начать выполнять свою работу (например, с помощью AutoResetEvent). Узор A-C-A-C ...

Позже запускается новый поток (B) (например, действием пользователя), и его задание должно выполняться между двумя ранее существовавшими потоками следующим образом: A выполняет свою работу, затем сигнализирует B, а когда B завершает свою работу, сигнализирует C Теперь шаблон ABCABC ...

Таким образом, до того, как поток C ожидал на EventWaitHandle, совместно используемом с A, и позже должен быть безопасный механизм, который заставляет C ожидать другого EventWaitHandle, совместно используемого с B. Мне кажется, что сложная часть заменяет EventWaitHandle, используемый C, поскольку, как только это будет сделано, я легко смогу запустить B, который будет использовать EventWaitHandle для ожидания задания A и EventWaitHandle для подачи сигнала на задание C. Механизм также должен обеспечивать способ безопасного демонтажа потока B и возврата к исходной ситуации, когда работают только потоки A и C.

Есть ли безопасный способ сделать это с помощью EventWaitHandle? Если нет, то любые другие предложения будут оценены.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2011

Если задача A знает об изменении, то задача C должна быть владельцем события. Задача A сигнализирует событие задачи C, если C должен быть следующим, или событие задачи B, если задача B должна быть следующей.

В качестве альтернативы, используйте тот же механизм, что и для изменения любых других общих данных: захватите мьютекс через все обращения к дескриптору. например задача C получает блокировку, читает дескриптор, снимает блокировку, ожидает на дескрипторе. Чтобы изменить его, необходимо, чтобы поток пользовательского интерфейса получил блокировку, изменил дескриптор, снимите блокировку.

0 голосов
/ 18 февраля 2011

Задумывались ли вы о реализации какого-либо планировщика, в котором потоки могут регистрироваться (отменять регистрацию) с помощью дескриптора для запуска и сигнализации о завершении.Затем планировщик позаботится о запуске следующего потока, установив соответствующее событие запуска, и продолжит работу со следующим потоком, когда предыдущий установил событие завершения.

...