Может ли оборудование изменить порядок атомной нагрузки, за которой следует атомный магазин, если хранилище условно подхC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Может ли оборудование изменить порядок атомной нагрузки, за которой следует атомный магазин, если хранилище условно подх

Сообщение Anonymous »

Может ли оборудование переупорядочить атомную нагрузку с последующей атомной хранилищем, если хранилище является условным на нагрузке? It would be highly unintuitive if this could happen, because if thread1 speculatively due to branch prediction, or for whatever reason, writes y = 1 before the condition in the if statement is confirmed as true, then if it later finds out the condition resolves to false, there is no way to undo the damage (roll back the changes), because another thread may have already read the updated value of y!
Я не думаю, что выпуск и приобретение семантики поможет в этом случае. Std :: memory_order_release on y.store () будет использоваться для выполнения более ранних записей, видимых в другие потоки, которые видели значение y , но в этом случае ничто не может сделать, чтобы повлиять на видимость x в других потоках, потому что x не было написано по потоке1. Примеры, которые я видел в документации C ++ для получения семантики приобретения и выпуска только о паре потоков, где один из них является чисто автором, а другой-чисто читатель.std::atomic x;
std::atomic y;

void thread1() {
int val = x.load(std::memory_order_relaxed);
if( val == 42 ){
y.store(1, std::memory_order_relaxed);
}
}
< /code>
Изменить: меня попросили предоставить примеры, включая другие потоки. Один рассказывает о упорядочении магазинов, как воспринимается наблюдателями, в то время как другой касается возможности спекулятивного исполнения магазинов. к другой переменной, и хранилище является условным (через оператор IF) в результате нагрузки (это то, что делает Thread1 в примере), то ли оператор IF эффективно устанавливает забор для хранения нагрузки, то есть нагрузка должна быть завершена до того, как хранилище сможет стать видимым для любого другого потока (или любого другого объекта наблюдения, такого как устройство прямого доступа к памяти)? В терминологии C ++, устанавливает ли оператор IF, что между магазином и нагрузкой? Досадно в документации C ++ о упорядочении памяти ничего не упоминается о условных магазинах. В формализме C ++ происходит прежде, чтобы это было установлено, если в магазине используется упорядочение выпуска. Но заказ выпуска также останавливает повторное застройку магазинов магазинов, поэтому он более строг, поэтому, если моя идея работает, и вам нужно только заказ в магазине нагрузки, оператор IF без каких-либо явных заборов памяти может быть более эффективным, чем store_release. Я полагаю, что вероятно, что это всегда работает на реальном оборудовании, но документация C ++ просто неполна и дает более слабые гарантии, чем необходимо, что позволяет поведение, которое никогда не может произойти на реальном оборудовании в реальном мире. Прибытие (стать видимым) в Thread3 До появления нового значения X (становятся видимыми) в Thread3? Затем представьте, что Thread2 записывает X в качестве сообщения в Thread1 и Thread3, а Thread1 записывает Y как сообщение Thread3. возможно ли в реальном оборудовании, что задержка обратной к спине (поэтому сумма задержек) сообщения от Thread2 до Thread1, а затем сообщение от Thread1 To Thread3 может быть ниже (быстрее), чем задержка сообщения непосредственно от Thread2 до Thread3? произойдет или объясните, почему нет реального оборудования, на котором это происходит.// This example is about ordering.
// Will thread3 see the new value of x, if thread1 has seen it?
std::atomic x;
std::atomic y;

void thread1() {
int val = x.load(std::memory_order_relaxed);
if( val == 42 ){
y.store(1, std::memory_order_relaxed);
}
}

void thread2() {
x.store(42, std::memory_order_relaxed);
}

void thread3() {
if( y.load(std::memory_order_relaxed) == 1 ){
std::atomic_thread_fence(memory_order_acquire);
int r = x.load(std::memory_order_relaxed);
assert(r == 42); // Can this go wrong?
}
}
< /code>
// Similar, but we're putting it inside a loop
// to make it a little more interesting.
// This focuses on speculative execution.
std::atomic x;
std::atomic y;
std::atomic terminate;

void thread1() {
while( !terminate.load(std::memory_order_relaxed) ){

int val = x.load(std::memory_order_relaxed);
if( val == 42 ){
// Can y.store() be done speculatively?
y.store(1, std::memory_order_relaxed);
break;
}

}
}

void thread2() {
// This will count down and write to x,
// but should never actually store the value 42.
for(int idx = 10000000; idx > 42; --idx){
x.store(idx, std::memory_order_relaxed);
}
sleep_seconds(10);
terminate = true;
}

void thread3() {
while( !terminate.load(std::memory_order_relaxed) ){

if( y.load(std::memory_order_relaxed) == 1 ){
// This should never happen!
Open_Pandoras_Box();
Launch_Nuclear_Missiles();
Unleash_Armageddon();
break;
}

}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... f-the-stor
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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