Существуют раса данных в абсолютном конкретном случаеC++

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

Сообщение Anonymous »

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

volatile int a = false, b = false;

// start new thread. if returned true - thread begined executing
bool start(void (*)());

void f()
{
while(!a) ;
b = true;
}

int main()
{
if (start(f))
{
a = true;
while (!b) ;
}
return 0;
}
< /code>
в этом коде существуют «Раса данных»? UB и т. Д.? Органируется ли Main 
выйти? Таким образом, когда a = true; выполнено
in main это стало видно в f
[*] нам не нужен атомный доступ к . Потому что выражение! A имеет только
2 значения: true of false . Даже если a = true; не будет атомным
, и разные данные будут, несколько раз, записанные в , прежде чем
станет a == true , это ничего не влияет. Даже если! A прочитать
Промежуточное значение из (не false , а не true ), в любом случае
выражение! A будет или false или true . и, наконец, < /code> стал ,! A стал false , и Where (! a); будет разбит. Даже
Если цикл стал разбитым до , стал True это нормально, но цикл
не будет разбит, пока a == false , поэтому до тех пор, пока мы не начнем
выполнить a = true в основном
[*] так после a = true; - while (! a); /> выполнено. exaclty, как для , b = true break while (! b); lo /> В качестве примера, если у нас есть int x = 0; и 2 потоки выполнять x ++ мы
могут иметь x == 1 или x == 2 при выходе. Оба потока могут читать 0 из
x, urcement 0 и написать от 1 до x < /code>. или первый поток изменится от 0 до 1, а затем другой изменится от 1 до 2. y = 1; } < /code> и
Другое t#2 do {while (! y); print (x); } T#2 может печатать и 0
и 1. Опять же данные Data Race;
[*] В случае int x = 0; t#1 {x = 0x12345678; } и t#2 {print (x); } возможно x = 0x12345678; не будет атомным и скажем, t#2 print

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

0x00005678
Но в конкретном случае, в какой расе данных?! ! в любом случае будет false или true (примечание - я говорю о выражении ! A не о value из )
или, может быть, кто -то говорит, что чтение A в f () может поднять исключение, если A = true; не At ATOMIC. />
Различные потоки выполнения всегда разрешают доступ (чтение и
modify) различные местоположения памяти одновременно, без помех
и без требований к синхронизации. *< /p>
< /blockquote>
Итак, что делает этот конкретный пример свободным от данных? Этот факт, используя специальные данные выражение (! a ), а не сами данные (

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

a< /code>), устраняет расу данных в данном конкретном случае < /p>

Я заменяю тип переменных от Bool < /code> на int < /code>
, потому что, похоже, добавляет уровень недопонимания. Я не предполагаю, что 
(и b ) может иметь только 2 значения. В случае int это более очевидно. Я не предполагаю, что A имеет атомный доступ, 1 байт размера и т. Д. Опять же, в случае int это более очевидно. Но это не меняет результат. выражение ! A может иметь только 2 значения - true или false . цикл while (! a); может быть прерван или нет (или как написано в одном ответе - это может привести к исключению - может?). И дело в том, что в конечном итоге цикл (! a); будет прерван (когда поток видит окончательное значение ()). и это не будет прервано рано, пока операция a = true; начнет выполняться. Если f видит промежуточное значение - его можно прервать или нет. Но это не имеет значения. Если это будет прервано - это уже в порядке. Если нет - он будет продолжать выполняться до тех пор, пока поток не увидит окончательное значение A - в обоих случаях OK

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

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

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

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

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

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