Корректный многопток.

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Ещё раз добрый вечер!!!

Как сделать так: (мне кажется как-то через C#), увеличить глобальную / обычную переменную счётчик на "1", но при этом, что бы в это же время не смог сделать, того же самого, другой поток. А то бывает 15 потоков в одно время запускаются, и в одно время счетчики меняют, когда пересекаются во время работы.
 
Последнее редактирование:

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
а как поток должен понять что ему нужно увеличивать переменную и как поток должен понять что ему сейчас не нужно увеличивать переменную? это те вопросы, на которые у вас должны быть ответы перед реализацией
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
а как поток должен понять что ему нужно увеличивать переменную и как поток должен понять что ему сейчас не нужно увеличивать переменную? это те вопросы, на которые у вас должны быть ответы перед реализацией
Ну вроде как то налепил, почти работает ) Очень просто, проверяет перед счетчиком значение переменной, например если меньше 15, то идем к блоку и увеличиваем переменную +1
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
И вот два нерадивых потока ехали ночью вдоль кладбища, и тут видят - переменная меньше 15 стоит!!! и нет чтобы бросить одного на съедение проклятым зомби и скрыццо...
это я к чему... пока поток уже проверил, что переменная меньше 15, но еще не увеличил её, второй поток тоже уже может проверить эту переменную))) а потоков может быть и не два... в общем... если что то хреновое может случиться, то оно произойдет)
 
  • Спасибо
Реакции: alekwuy

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
И вот два нерадивых потока ехали ночью вдоль кладбища, и тут видят - переменная меньше 15 стоит!!! и нет чтобы бросить одного на съедение проклятым зомби и скрыццо...
это я к чему... пока поток уже проверил, что переменная меньше 15, но еще не увеличил её, второй поток тоже уже может проверить эту переменную))) а потоков может быть и не два... в общем... если что то хреновое может случиться, то оно произойдет)
А что можете подсказать тогда? Я просто первый проект с глобальными делаю) Вот скажем что бы поток на 15 более менее было ) Счетчики в общем, 2-3 на проект, работали корректно. Какую проверку можно сделать?
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
А вот же у вас готовое решение уже есть
http://zennolab.com/discussion/threads/globalnye-peremennye-mnogopotochnost.15490/#post-94482
ну чуть чуть приукрасить напильником
Код:
// блокируем выполнение, чтобы другие потоки не испортили
lock(SyncObject)
{
    IGlobalVariable gv = null;
    try
    {
        // пытаемся получить глобальную переменную
        gv = project.GlobalVariables["[email protected]", "globalstart"].Value;
        if (int.Parse(gv)<15)
        {
            //делаем что нибудь... например..
            return false;
        }
        else
        {
            project.GlobalVariables["[email protected]", "globalstart"].Value = int.Parse(gv)+1;
            return true;
        }
    }
    catch(KeyNotFoundException exception)
    {
        // если не удалось получить, то инициализируем значением по умолчанию.
        project.GlobalVariables.SetVariable("[email protected]", "globalstart", 0);
    }
}
 
  • Спасибо
Реакции: Voldemar и bigcajones

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
А вот же у вас готовое решение уже есть
http://zennolab.com/discussion/threads/globalnye-peremennye-mnogopotochnost.15490/#post-94482
ну чуть чуть приукрасить напильником
А как поставить, что бы он число сравнивал из переменной проекта, например так могу написать, ( или как правильно) if (int.Parse(gv)<project.GlobalVariables["s4et4ik"].Value)
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
У меня по похожему принципу сделано, но все равно, бывает одну и туже переменную обрабатывают в одно время, вот как залочить....
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 984
Благодарностей
817
Баллы
113
project.GlobalVariables["s4et4ik"].Value тоже имеет тип string, поэтому её тоже надо парсить с помощью Int32.Parse(...); перед сравнением
 

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