Глобальная переменная при запуске в многопотоке

tryinfinity

Client
Регистрация
24.12.2016
Сообщения
141
Благодарностей
3
Баллы
18
Доброго дня! Помогите пожалуйста решить проблему.
Задача - запускать проект в многопотоке, но каждый последующий поток запускать после выполнения предыдущим определенного действия.
Попробовал через глобальную переменную, т.е. если глобальная не инициализирована, то инициализировать её и присвоить значение 1. После выполнения нужного действия в первом потоке, глобальной присваивается значение 0, это видит второй поток и выходит из цикла ожидания.
Проблема оказалась в том, что при запуске одновременно стартуют все потоки одновременно и все инициализируют глобальную, хотя по идеи должен инициализировать её только первый поток.
 

dr1veq

Пользователь
Регистрация
09.02.2018
Сообщения
39
Благодарностей
44
Баллы
18
Код:
int check = -1;
lock(SyncObject) {
  try
{
  check = Convert.ToInt32(project.GlobalVariables["threads", "thread1"].Value);
}
  catch (KeyNotFoundException ex)
{
  project.GlobalVariables.SetVariable("threads", "thread1", 1);       
}

if (check == 1)
{
  throw new Exception ("ERROR");
}

}
Плюс поставьте рандомную паузу от 1 до 15 сек перед началом проверки, так должно работать.
 
  • Спасибо
Реакции: arhip1985

tryinfinity

Client
Регистрация
24.12.2016
Сообщения
141
Благодарностей
3
Баллы
18
Не совсем понимаю что этот код делает, т.к. в C# не силен, но если делать рандомную паузу, то и без него работает) но как то это костыльно мне кажется.
Как вариант думал определять номер текущего потока, закидывать его в переменную и если он больше 1, то делать паузу 1 сек, чтоб первый поток успел инициализировать глобальную переменную
 

dr1veq

Пользователь
Регистрация
09.02.2018
Сообщения
39
Благодарностей
44
Баллы
18
Не совсем понимаю что этот код делает, т.к. в C# не силен, но если делать рандомную паузу, то и без него работает) но как то это костыльно мне кажется.
Как вариант думал определять номер текущего потока, закидывать его в переменную и если он больше 1, то делать паузу 1 сек, чтоб первый поток успел инициализировать глобальную переменную
В зенке много чего работает с костылями, если нужно без - переходите на чистый шарп.
Должно работать и без паузы, для полной уверенности лучше поставить.
По коду - лочит глобальную переменную для 1 потока, проверяет ее наличие, если она уже создана - берет значение, если нет создает со значением 1 и по зeлёной ветке выходит с кубика.
Если переменная уже создана и ее значение 1, то выходит по красной ветке.
 

tryinfinity

Client
Регистрация
24.12.2016
Сообщения
141
Благодарностей
3
Баллы
18
Блин, все рано как то через раз работает. Может есть другие варианты?
 

tryinfinity

Client
Регистрация
24.12.2016
Сообщения
141
Благодарностей
3
Баллы
18

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)