Блокировка объектов с целым числом
У меня есть куча объектов, и каждый объект имеет уникальный идентификатор.
Мне нужно заблокировать объекты так, чтобы только одному из объектов было разрешено выполнять определенную операцию одновременно.
У меня появилась идея определить целое число, к которому имеют доступ все объекты.
Если блокировка свободна, целое число содержит ноль. Затем объекту разрешается помещать свой собственный уникальный идентификатор в целое число, выполнять операцию и впоследствии возвращать ноль.
Если какой-либо другой объект проверяет целое число, пока он заблокирован, он увидит ненулевое значение, отличное от своего собственного идентификатора, и будет отменен.
Я почти на 100% уверен, что я заново изобретаю старый принцип, но не учусь CS, я даже не знаю, как он называется, поэтому я не знаю, что искать.
Является ли мой подход к блокировке звука / ошибочным, и что я должен читать?
Обратите внимание, что это довольно низкий уровень 61131-3/PLC-программирования, поэтому нет шаблонов Singleton и т. Д.
Спасибо
2 ответа
Ваше описание очень похоже на блокировку, известную по многопроцессорному программированию.
Если вы используете только один процесс или сканирование ПЛК, ваша идея использовать общее целое число будет работать. В противном случае вам придется сделать немного больше, чтобы не допустить одновременной блокировки ваших объектов. Также вы должны добавить функциональность в вашу программу, чтобы выйти из тупика, то есть, если объект делает блокировку и никогда не снимает ее снова.
Вот объяснение блокировки в Вики: https://en.wikipedia.org/wiki/Lock_(computer_science)
Использование блокировки зависит от того, какую марку ПЛК вы используете, о чем вы не упомянули. Если вы, например, используете TwinCAT3, вы можете использовать "FB_IecCriticalSection", описанный здесь:
Дополнительная информация по теме (для TwinCAT): https://infosys.beckhoff.com/english.php?content=../content/1033/tc3_plc_intro/18014403093939979.html&id=3121411705348577788