Использование блокировки, Monitor Pulse и Wait для синхронизации потоковC#

Место общения программистов C#
Ответить
Anonymous
 Использование блокировки, Monitor Pulse и Wait для синхронизации потоков

Сообщение Anonymous »

Я прочитал официальную документацию и около 25 учебных пособий, но все еще пытаюсь понять, как синхронизировать, скажем, 3 потока с методами Monitor Pulse() и Wait() и использовать объекты блокировки.
(Да, я знаю, что существуют другие методы синхронизации, но это должно быть выполнимо, и это меня расстраивает)
Вот моя простая идея «доказательства концепции». Я придумал.
Предположим, у меня есть три потока, каждый из которых имеет задачу:
  • Поток1 запускает задачу, которая выводит все целые числа, делящиеся на 3.
  • Поток2 запускает задачу, которая выводит все целые числа, остаток которых равен
    1 при делении на 3.
  • Поток3 запускает задачу, которая выводит все целые числа, остаток равен
    2 при делении на 3
Я бы хотел, чтобы в конечном итоге результат был: 0,1,2,3,4,5,6,... до любого целочисленного предела, который я мог бы выбрать, но мы можем сказать 50 или 100 - это не имеет значения.
Я хотел бы более полно понять механизм блокировки против 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»