Почему барьер приобретения не может остановить переупорядочение вокруг филиала?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему барьер приобретения не может остановить переупорядочение вокруг филиала?

Сообщение Anonymous »

Я проверял поведение контрольных зависимостей в барьеры памяти ядра Linux и имел проблему с местоположением забора. < /p>
Вот тестовый фрагмент: < /p>

Код: Выделить всё

std::atomic x;
std::atomic y;

int r1;
int r2;

void thread1_func() {
r1 = x.load(std::memory_order_relaxed);
if (r1) {
r2 = y.load(std::memory_order_relaxed);
}
}

void thread2_func() {
y.store(42, std::memory_order_relaxed);
x.store(1, std::memory_order_release);
}

void thread3_func() {
if (r2 == 0) {
return;
}
if (r1 == 0) {
printf("r1: %d, r2: %d\n", r1, r2);
}
}

int main() {
while (1) {
// reset
x.store(0);
y.store(0);
r1 = 0;
r2 = 0;

std::thread t1(thread1_func);
std::thread t2(thread2_func);
std::thread t3(thread3_func);

t1.join();
t2.join();
t3.join();

return 0;
}
}
thread3_func введет ветвь if (r1 == 0) (мы будем ссылаться на его как ветвь печати ниже), что не то, что я хочу (Thread3 видел побочный эффект thread1 загрузки y r2 с помощью филиала или чего -то). ниже. < /p>
Неправильный забор < /h3>

Код: Выделить всё

void thread1_func() {
r1 = x.load(std::memory_order_acquire);
if (r1) {
r2 = y.load(std::memory_order_relaxed);
}
}
< /code>
или < /p>
void thread1_func() {
r1 = x.load(std::memory_order_relaxed);
if (r1) {
std::atomic_thread_fence(std::memory_order_acquire);
r2 = y.load(std::memory_order_relaxed);
}
}
< /code>
Но эти 2 примера не сработали! < /p>
 'Правильный' Fence < /h3>
, пока я не попробую забор ниже: < /p>
void thread1_func() {
r1 = x.load(std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_acquire);
if (r1) {
r2 = y.load(std::memory_order_relaxed);
}
}
на это время thread3_func никогда не введет ветвь печати.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... d-a-branch
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»