Как заменить во время выполнения Wime Waithandle, что нить должна ждать

StackOverflow https://stackoverflow.com/questions/5039679

  •  15-11-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

If task A knows about the change, then have task C own the event. Task A signals task C's event if C is to be next, or task B's event if task B is to be next.

Alternatively, use the same mechanism as for changing any other shared data: acquire a mutex across all accesses to the handle. e.g. task C acquires the lock, reads the handle, releases the lock, waits on the handle. To change it you have the UI thread acquire the lock, change the handle, release the lock.

Другие советы

Have you thought about implementing some sort of scheduler where the threads can register (deregister) with a handle to start and to signal completion. And the scheduler then takes care of starting the next thread by setting the appropriate start-event and continues with the next thread, when the previous one has set the completion event.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top