(Да, я знаю, что существуют другие методы синхронизации, но это должно быть выполнимо, и это меня расстраивает)
Вот моя простая идея «доказательства концепции». Я придумал.
Предположим, у меня есть три потока, каждый из которых имеет задачу:
- Поток1 запускает задачу, которая выводит все целые числа, делящиеся на 3.
- Поток2 запускает задачу, которая выводит все целые числа, остаток которых равен
1 при делении на 3. - Поток3 запускает задачу, которая выводит все целые числа, остаток равен
2 при делении на 3
Я хотел бы более полно понять механизм блокировки против Monitor.Wait() и Monitor.Pulse() и как они могут это сделать работать вместе.
Если я правильно понимаю, когда поток встречает блокировку (someObject) { ... , он получает монопольный доступ к этой критической области, если он там первый. Любой другой поток, обнаруживший блокировку того же объекта, застрял на этой строке (т. е. lock(someObject)) в соответствующем коде, верно?
Если поток 1 имеет блокировку(someObject), вызывает Monitor.Wait(someObject), то поток 1 снимает блокировку и входит в очередь ожидания, верно? Тогда, если какой-либо другой поток (например, поток 2) вызовет Monitor.Pulse(someObject), он переместит поток1 в очередь ready?
Независимо от того, что я пытаюсь, кажется, что код продолжает бесконечно ждать/блокироваться.
Я предполагаю, что мои сводные вопросы таковы:
- Нужно ли мне более одного объекта блокировки для синхронизации трех потоков с помощью Pulse и Wait?
- Где в этом коде будут находиться Wait и Pulse? Внутри блокировки цикла, который используется для перебора значений, которые мы хотим напечатать? Внутри блокировки, помещенной только внутри условия (например, if (i % 3 == 2)) ? И т. д.
ОБНОВЛЕНИЕ (07.08.2021):
Оказывается, сделать статические блокировки было необходимо, учитывая способ, которым я настроил их в одном файле. Меня раздражает то, что я не заметил этого раньше, но предложенная онлайн-документация (с веб-сайта Джо Альбахари) оказалась чрезвычайно полезной.
Подробнее здесь: https://stackoverflow.com/questions/686 ... ze-threads
Мобильная версия