Литература / документация по двум взаимодействующим процессам с использованием флага для свободной памяти без блокировки - PullRequest
2 голосов
/ 14 января 2010

Есть ли другая документация / обсуждение следующего шаблона проектирования (я не уверен, как он называется) из известного источника? Я почти на 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.)

Ответы [ 2 ]

1 голос
/ 14 января 2010

можно попробовать че. Решение Дж. Деккера , упомянутое Э. В. Дейкстрой в его статье EWD1303 . alt text

А потом произошло нечто глубокое и прекрасное. Анализируя чем Структура аргумента доказательство обязательства могут быть выполнены, численный математик Th.J. Деккер разработан за несколько часов
вышеупомянутое решение вместе с его аргументом правильности, и это решило конкурс.
В приведенном выше решении пара "c1, c2" реализует взаимное исключение, в то время как «поворот» был введен для разрешения связи, когда два процесса одновременно пытаются войти в свои критические секции.

1 голос
/ 14 января 2010

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

http://en.wikipedia.org/wiki/Dining_philosophers_problem

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...