Неожиданный результат, когда два потока обращаются к глобальной переменной - PullRequest
0 голосов
/ 29 марта 2019

У меня есть две темы, t1 и t2.
Они оба добавляют операцию над глобальной переменной с именем count, которая была инициализирована с 0.
t1 делает count++ и t2 делает count+=100. Сначала я начинаю t1, затем t2, но результат не соответствует моим ожиданиям. Я что-то не так понял?

Это не поможет, хотя я использовал lock () в двух потоках.

Вот код C #:

private int count = 0;
private object locker = new object();

void run()
{
    var t1 = new Thread(Add_1);
    var t2 = new Thread(Add_2);
    t1.Start();
    t2.Start();
}
void Add_1()
{
    lock(locker)
    {
        count++;
        Console.WriteLine(count);
    }
}

void Add_2()
{
    lock(locker)
    {
        count += 100;
        Console.WriteLine(count);
    }
}

Иногда печатает

1
101

или

100
101

Я понятия не имею об этом. По моему мнению, у t1 должен быть шкафчик, пока он не закончил свою работу. Но, похоже, у t2 есть шанс добавить счет раньше, чем t1.

Надеюсь, кто-нибудь может мне помочь, спасибо.

1 Ответ

1 голос
/ 29 марта 2019

Что не так?На самом деле, порядок, который вы определяете или запускаете в своем коде, не говорит вашему компьютеру, как выполнить.Фактически, у вас есть два полностью разделенных потока, и ваша ВМ / Процессор может выполнять его в любом порядке.Блокировка не говорит ему, каков правильный порядок выполнения, но только в одном потоке, другие потоки должны ждать.

Итак, ваша программа работает нормально.Если вы хотите выполнить его в порядке, вам не нужны потоки, или вы можете использовать любой метод async / await для их синхронизации, или вы можете перевести один в спящий режим.

Может быть, вы хотите взятьвзгляд на эти статьи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...