Как я чередую эти процессы?

Я только начинаю изучать чередование, и у меня есть программа с двумя следующими процессами:

Процесс № 1:

    shared int x;
    x = 7;
    while true {
       x = x - 1;
       x = x + 1;
       if (x != 7)
          printf("x is %d", x);

Процесс № 2:

    shared int x:
    x = 7;
    while true {
       x = x - 1;
       x = x + 1;
       if (x != 7)
          printf("x is %d", x);

Если не было ограничений на порядок чередования, как я могу упорядочить или чередовать эти два процесса так, чтобы печаталось "x is 7"?

1 ответ

Решение

Процесс, который печатает "x is 7", должен будет "видеть", что x не равен 7 в момент, когда он выполняет свой if-тест, но тогда x должен стать 7 к тому времени printf() читает его значение, чтобы распечатать его. Итак, что-то вроде:

Process #1:   x = x - 1;  // x becomes 6
Process #2:   x = x - 1;  // x becomes 5
Process #1:   x = x + 1;  // x becomes 6
Process #1:   if (x != 7) // if-test succeeds, because x is 6
Process #2:   x = x + 1;  // x becomes 7
Process #1:   printf("x is %d", x);  // prints "x is 7"

Обратите внимание, что это только один из вышеперечисленных способов; особенно если x не изменяется атомарно, есть множество других способов, которыми вещи могут стать странными, из-за выделения регистров, взаимодействия с кэшем ЦП, оптимизации компилятором и переупорядочения кода с использованием правила "как если" и т. д.

Другие вопросы по тегам