Я смущен этот вопрос:
У меня есть функция C++:Как взаимодействие контекста потока работает с глобальной переменной?
void withdraw(int x) {
balance = balance - x;
}
balance
является глобальной целочисленной переменной, которая равна 100
на старте.
Мы запускаем вышеуказанную функцию с двумя различными резьбами: резьбой A и резьбой B. Резьба A Запуск withdraw(50)
и резьба B run withdraw(30)
.
Предполагая, что мы не защищаем balance
, каков конечный результат balance
после запуска этих потоков в следующих последовательностях?
- A1-> A2-> A3-> В1-> В2> В3
- В1-> В2> B3-> A1-> A2-> A3
- A1-> A2-> В1-> В2> B3-> A3
- В1-> В2> A1-> A2-> A3-> B3
Объяснение:
A1 означает OS выполнить первый линия функции
withdraw
в потоке A, A2 означает, что ОС выполняет вторую строку функцииwithdraw
в потоке A, B3 означает, что ОС выполняет третью строку функцииwithdraw
в потоке B и т. Д.Последовательность заключается в том, как график расписания ОС A & B предположительно.
Мой ответ
- 50 (Перед тем как переключение контекста, OS сохраняет
balance
. После переключения контекста, OS восстановлениеbalance
до 50) - 70 (Похожие выше)
Но мой fr iend не согласен, он сказал, что balance
является глобальной переменной. Таким образом, он не сохраняется в стеке, поэтому он не влияет на переключение контекста. Он утверждал, что все 4 последовательности приводят к 20.
Итак, кто прав? Я не могу придраться к его логике.
(Предположим, у нас есть один процессор, который может выполнять только один поток в то время)
Что вы подразумеваете под строкой 1,2,3? Функция имеет только одну строку – MikeMB
Из того, что я понимаю, строка 1 - '{', строка 2 - это 'balance = balance - x' line 3 is'} '. –
Тогда я не вижу смысла вопроса, потому что декремент произойдет «атомарно» (если вы разрешаете прерывание между линиями). Типичным способом разделить это будет 1: Нагрузка, если баланс из памяти 2: уменьшить значение на X, 3: вернуть результат обратно на баланс. – MikeMB