Как атомарно поменять местами два указателя в Windows? - PullRequest
6 голосов
/ 21 декабря 2010

Хорошо, я спрашиваю то же самое, что и этот удаленный вопрос , но я задаю его более прямо.

У меня есть две переменные-указатели в двух экземплярахтот же класс.Я хотел бы поменять местами содержимое этих переменных (не то, на что они указывают, а только сами переменные).

Я бы хотел избежать блокировок, если это вообще возможно.

Какмне сделать это?

РЕДАКТИРОВАТЬ: На три миллиарда ответов "InterlockedExchangePointer", пожалуйста, сначала прочтите MSDN документы .InterlockedExchangePointer обменивается значением целевого указателя со значением в регистре стека .Он (сам по себе) не обменивается двумя указателями в ячейках памяти.

Ответы [ 3 ]

13 голосов
/ 22 декабря 2010

Я собираюсь выйти на конечность и сказать, что вам нужна блокировка и что нет общего решения этой проблемы без блокировок.

Вам нужно будет прочитать два адреса и записать их обратно на оба адреса атомарно.Насколько мне известно, X86 может атомарно обмениваться данными только с одного адреса памяти и регистра.Я не думаю, что можно обмениваться содержимым двух адресов памяти.

Если вы можете наложить ограничения на то, где находятся указатели, вы можете сделать это.Например, если вы можете гарантировать, что указатели находятся в памяти рядом, вы можете использовать 64- или 128-битное сравнение / обмен в цикле.

Могут быть решения для других простых случаев, но яНе думаю, что вы найдете решение без блокировки для общего случая.

2 голосов
/ 22 декабря 2010

Вы ищете атомарную, заблокированную версию swap.

Насколько мне известно, нет способа сделать это, используя только примитивы Windows API и без явной блокировки.Различные Interlocked функции, рекомендуемые другими, не будут работать, потому что изменяется только один из переданных параметров.Вы хотите изменить их оба.

Я мог бы также отметить, что функции Interlocked связаны только друг с другом.Если у вас есть другой фрагмент кода, который обновляет один из этих указателей, но не использует Interlocked, ваш код больше не является безопасным.Я уверен, что вы понимаете это, но подумал, что я упомяну это.

Насколько я знаю, вам нужно будет использовать библиотеку или написать свой собственный код для обработки этого.

0 голосов
/ 22 декабря 2010

Проверьте инструкции xchg процессора x86, если они делают то, что вы хотите, тогда вы можете обернуть их в функцию встроенной сборки.Все отдельные инструкции процессора гарантированно являются атомарными.

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