@ander822
Начинающий

Как правильно дожидаться в одном потоке пока другой поток не изменит значение переменной?

Есть два потока и переменная со значением null.
Один из потоков должен изменить значение этой переменной, а второй поток должен дождаться этого и использовать ее значение в дальнейших расчетах.
Сейчас у меня второй поток дожидается изменения переменной в бесконечном цикле
while(SomeVariable == null)
{

}
...

Существуют ли другие способы сделать тоже самое? Возможно более изящные.
  • Вопрос задан
  • 234 просмотра
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
Заранее создаете
var waitEvent = new ManualResetEvent(false);
В одном потоке, где нужна уже инициализированная переменная
waitEvent.Wait();
В другом:
SomeVariable = new ...
waitEvent.Set();
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gzhegow
@gzhegow
Думал, стану умнее, когда адаптируюсь, но нет
На мой взгляд либо записать в файл или в оперативку, а там while-ом проверять, но это слегка идиотский способ. Общий смысл каким-то образом оповестить систему, что поток закончил работу и пора работать с ожидающим потоком.

Если провести аналогию на "деферы" яваскриптовые, то там бы это стало 3 потока. Сначала делается один, а запускаются потом второй (ожидающий), и третий (продолжаем действия по первому). А вот если они у вас друг другу переменные передают, тот тут я мыслю о рекурсии с периодическим запуском 1-2-1-2-1-2..., а может даже полную перестройку логики

Могу быть неправ.
Ответ написан
devspec
@devspec
Помогло? Отметь решением
Eсли переменная целочисленная, то можно через Interlocked.Read
Любые другие типы можно через Monitor проверять:

while(true)
{
    Monitor.Enter();
    if(SomeVariable == null) {
       // do something
    }
    Monitor.Exit();
}
...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Технология Екатеринбург
от 60 000 до 150 000 ₽
от 110 000 до 150 000 ₽
BRIO MRS Казань
от 70 000 до 120 000 ₽
06 авг. 2020, в 22:41
900 руб./в час
06 авг. 2020, в 22:18
3000 руб./за проект
06 авг. 2020, в 22:15
60000 руб./за проект