Вы не говорите точно, что блокировка и разблокировка в этом коде. Я предполагаю, что это мьютексные операции. На powerpc функция получения мьютекса будет использовать isync (без которого аппаратное обеспечение может оценивать ваш if (! PInst) перед блокировкой ()) и будет иметь lwsync (или синхронизацию, если ваша мьютексная реализация древняя) в unlock () .
Таким образом, предполагается, что все ваши обращения (как чтение, так и запись) к pInst защищены вашими методами блокировки и разблокировки, которые использует ваш барьер, излишни. Разблокировка будет иметь достаточный барьер, чтобы гарантировать, что хранилище pInst будет видимым до завершения операции разблокировки (чтобы оно было видно после любого последующего захвата блокировки, предполагая, что используется та же самая блокировка).
На x86 и x64 ваша блокировка () будет использовать некоторую форму инструкции с префиксом LOCK, которая автоматически имеет поведение двунаправленного ограждения.
Ваша разблокировка на x86 и x64 должна быть только инструкцией хранения (если вы не используете некоторые специальные строковые инструкции в вашей CS, в этом случае вам понадобится SFENCE).
Руководство:
http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf
содержит хорошую информацию обо всех заборах, а также об эффектах префикса LOCK (и когда это подразумевается).
пс. В вашем коде разблокировки также должно быть что-то, обеспечивающее упорядочение компилятора (поэтому, если это просто нулевой магазин, вам также потребуется что-то вроде стиля GCC asm _ volatile _ ("" ::: "memory")).