Я не смог найти информацию о том, в какой области компилятор прекращает делать команды, переупорядочивая, когда видит блокировку или барьер памяти.
Например, в приведенном ниже псевдокоде со ссылкой на c ++ lang
Есть ли разница в порядке следования инструкций на a,x
в случаях, когда lock
перемещается в отдельную функцию bar
по сравнению с функцией foo
?
Являются ли ответы одинаковыми если lock
заменяется полным барьером памяти?
int func foo()
{
read a;
x = 10;
{
lock(mutex);
z++;
unlock(mutex);
}
a += 1;
return x;
}
против
int func foo()
{
read a;
x = 10;
bar();
a += 1;
return x;
}
func bar()
{
lock(mutex);
z++;
unlock(mutex);
}