Код: Выделить всё
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 in main это стало видно в f
[*] нам не нужен атомный доступ к . Потому что выражение! A имеет только
2 значения: true of false . Даже если a = true; не будет атомным
, и разные данные будут, несколько раз, записанные в , прежде чем
станет a == true , это ничего не влияет. Даже если! A прочитать
Промежуточное значение из (не false , а не true ), в любом случае
выражение! A будет или false или true . и, наконец, < /code> стал
Код: Выделить всё
trueЕсли цикл стал разбитым до , стал 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>. или первый поток изменится
Код: Выделить всё
xДругое 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или, может быть, кто -то говорит, что чтение A в f () может поднять исключение, если A = true; не At ATOMIC. />
Различные потоки выполнения всегда разрешают доступ (чтение и
modify) различные местоположения памяти одновременно, без помех
и без требований к синхронизации. *< /p>
< /blockquote>
Итак, что делает этот конкретный пример свободным от данных? Этот факт, используя специальные данные выражение (! a ), а не сами данные (
Код: Выделить всё
a< /code>), устраняет расу данных в данном конкретном случае < /p>
Я заменяю тип переменных от Bool < /code> на int < /code>
, потому что, похоже, добавляет уровень недопонимания. Я не предполагаю, что Код: Выделить всё
trueПодробнее здесь: https://stackoverflow.com/questions/797 ... cific-case
Мобильная версия