Алгоритм заполнения буфера без ожидания - PullRequest
1 голос
/ 15 июня 2011

У меня есть буфер постоянной ширины N, который заполняется несколькими процессами с обоих концов - каждый процесс может в один момент выдвинуть L элементов в крайние левые пустые позиции или R элементов в крайние правые пустые позиции.Я синхронизирую процессы по двум переменным (верхний левый стек и верхний правый стек), используя инструкцию CAS.

Гарантируется, что буфер не переполнится, фактически останется место для одного элемента между вершинами стеков.,Что мне нужно, так это то, что один и только один из этих процессов сообщит о положении этого пустого пространства.

Первоначально мне приходилось нажимать как на левую, так и на правую сторону в конце, поэтому после нажатия влево изатем справа процесс мог бы посмотреть на вершину левого стека, сравнить его + 1 с позицией его последнего правого толчка, и если эти два были равны, процесс был последним (последний процесс толкал вправо, когда буферзаполнен побед).Тем не менее, теперь я понял, что не могу гарантировать, что в конце концов будет проталкиваться обе стороны, поэтому этот протокол не может быть применен.

Можете ли вы придумать какой-нибудь протокол без ожидания, который будет достаточным?Я могу использовать больше переменных с инструкцией CAS, но я не могу атомарно изменить или прочитать более одной в один момент.Конечно, чем меньше переменных, тем лучше.

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