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

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

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

}
...

Существуют ли другие способы сделать тоже самое? Возможно более изящные.
  • Вопрос задан
  • 300 просмотров
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
Заранее создаете
var waitEvent = new ManualResetEvent(false);
В одном потоке, где нужна уже инициализированная переменная
waitEvent.Wait();
В другом:
SomeVariable = new ...
waitEvent.Set();
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
На мой взгляд либо записать в файл или в оперативку, а там 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();
}
...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы