Есть ли другая документация / обсуждение следующего шаблона проектирования (я не уверен, как он называется) из известного источника? Я почти на 100% уверен, что следующее будет безопасно управлять данными между двумя (не более чем двумя) процессами, но я чувствовал бы себя намного лучше, если бы мог найти более подробную информацию о том, почему это работает из авторитетного источника.
Предположим, у меня есть два процесса A и B, которые выполняются параллельно. Они имеют следующую структуру данных (в коде псевдо-C):
struct Shared
{
bool ownedByA
Otherstuff otherstuff;
}
Я могу использовать следующую пару конечных автоматов для безопасного управления этими общими данными:
A:
state A.A (data is owned by A), entered on startup:
read/modify/write "otherstuff"
when done, goto A.Adone
state A.Adone
set ownedByA to false
goto state A.B
state A.B (data is owned by B):
if ownedByA is true, goto state A.A
otherwise stay in state A.B
B
state B.A (data is owned by A), entered on startup:
if ownedByA is false, goto state B.B
otherwise stay in state B.A
state B.B (data is owned by B):
read/modify/write "otherstuff"
when done, go to B.Bdone
state B.Bdone:
set ownedByA to true
goto state B.A
Мы должны обеспечить, чтобы записи A.A в «другие материалы» и записи A.Adone в ownByA выполнялись в строгой последовательности, упорядочивая видимость памяти w / r / t. Аналогично для B.B и B.Bdone.
при запуске:
1. Initialize ownedByA to true, A to the A.A state, B to the B.A state
2. start running state machines
(ensure that 1. happens-before 2.)