Многопоток простой пример.

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 706
Баллы
113
хаос в вашем ожидании от работы глобальных переменных.
все работает как нужно)
 

shifu

Client
Регистрация
04.04.2011
Сообщения
168
Благодарностей
23
Баллы
18
запустил проект rostonix, нормально работает, если в настройках постера количество потоков в одном процессе поставлено на 1. Если больше, то начинаются глюки. Пожалуйста добавьте в настройки постера возможность поставить паузу между инициализациями потоков.
 

nomarketing

Client
Регистрация
01.11.2013
Сообщения
907
Благодарностей
178
Баллы
43
запустил проект rostonix, нормально работает, если в настройках постера количество потоков в одном процессе поставлено на 1. Если больше, то начинаются глюки. Пожалуйста добавьте в настройки постера возможность поставить паузу между инициализациями потоков.
Если там пример с локом обьекта, то работает нормально на сколько я помню.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 706
Баллы
113

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
786
Баллы
113
интересная у вас тут тема развелась
я тоже когдато долго вникал в тему ассинхронного кода.
Да, все так и есть, rostonix правильно пишет.
В ассинхронном исполнении кода не должно быть порядка. Там где наступает порядок означает, что возникает очеред в виде стека или списка задач.
Очень удачная анология про метро: многопоток это люди только спускающеся в в метро, стремящиеся к турникету, а список задач это люди уже в очереди к турнекету. Даже если им выдать по номерку но пустить в метро всех сразу, то в итоге все равно очередь будет не упорядочена. Чтобы очередь была полностью упорядоченна, нужно дождаться последнего человека и только тогда упорядочивать.
То есть проблема порядка в определенной части логического процесса решается ожиданием определенного сигнала, который означает что все все процессы стали в очередь.
Только после того как все процессы находятся в одинаковом состоянии образуется типа упорядочивания и перевод их в однопоточный режим до тех пор пока все процессы не пройдут этот тонкий мостик синхронности.
Все это можно сделать с помощью глобальных переменных и ожидания.
1 счетчик процессов для многпоточной части - уже есть.
1 итератор процессов для однопоточной части - похож на первый, но назначение и логика работы другая.
 

nomarketing

Client
Регистрация
01.11.2013
Сообщения
907
Благодарностей
178
Баллы
43
интересная у вас тут тема развелась
я тоже когдато долго вникал в тему ассинхронного кода.
Да, все так и есть, rostonix правильно пишет.
В ассинхронном исполнении кода не должно быть порядка. Там где наступает порядок означает, что возникает очеред в виде стека или списка задач.
Очень удачная анология про метро: многопоток это люди только спускающеся в в метро, стремящиеся к турникету, а список задач это люди уже в очереди к турнекету. Даже если им выдать по номерку но пустить в метро всех сразу, то в итоге все равно очередь будет не упорядочена. Чтобы очередь была полностью упорядоченна, нужно дождаться последнего человека и только тогда упорядочивать.
То есть проблема порядка в определенной части логического процесса решается ожиданием определенного сигнала, который означает что все все процессы стали в очередь.
Только после того как все процессы находятся в одинаковом состоянии образуется типа упорядочивания и перевод их в однопоточный режим до тех пор пока все процессы не пройдут этот тонкий мостик синхронности.
Все это можно сделать с помощью глобальных переменных и ожидания.
1 счетчик процессов для многпоточной части - уже есть.
1 итератор процессов для однопоточной части - похож на первый, но назначение и логика работы другая.
Все верно, я пока понимал в чем суть, хотя я тогда первый раз с потоками столкнулся, это было чесно говоря не много сложно из за недопонимания самого процесса их работы, но когда ты понимаеш как они работают, проблема исчезает, своего рода, называется прирурчить потоки :-)
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 454
Благодарностей
8 678
Баллы
113
нет, это называется, не приручить потоки, а приручить себя: понять логику работы программ..
;-)
 

nomarketing

Client
Регистрация
01.11.2013
Сообщения
907
Благодарностей
178
Баллы
43
нет, это называется, не приручить потоки, а приручить себя: понять логику работы программ..
;-)
Ну я приручал потоки приручая себя понять их логику так как изначально я не имел представление как они работают, хотя имел, думая что они все идут поочередно :-) а не в разброс :-) в итоге моя логика построение логических действий была ошибочна и приводила к отрицательным результатам по всему времени работы над созданием каких либо проэктов. Но когда ты понимаеш как они работаю, все становится ясным, но был еще один недостаток в знаний, это язык C#, я с ним раньше не сталкивался, ну он не такой тяжелый, рекомендуется знать хотя бы на базовом уровне.
 

nectah

Client
Регистрация
17.09.2010
Сообщения
93
Благодарностей
18
Баллы
8

rostonix

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

zena2015

Client
Регистрация
10.07.2015
Сообщения
44
Благодарностей
8
Баллы
8
Перерыл на форуме кучу тем про глобальные переменные и многопотоки. Многие ведут сюда, но я так и не нашел простого решения.
Единственный рабочий пример - на C# (http://zennolab.com/discussion/threads/mnogopotok-prostoj-primer.15888/page-2#post-97413)

Правильно ли я понял, что глобальные переменные в рамках конструктора не совсем правильно работают,
раз даже rostonix переделывал свой пример с обычного на C# чтобы он работал корректно?



Запустил его первый пример в 20 потоков - многие из них схватили сразу каждый переменную по 0,
ну и дальше наблюдались дубли и пропуски счетчика.
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 327
Благодарностей
5 429
Баллы
113
вот пример поправленный
анализируйте логигу шаблона. после смены глобальной переменной мы ее значение кидаем в локальную переменную и в проекте используем уже ее, если она нужна
После 2 запуска снипет не работает. Приходится закрывать зенку, что бы обнулить Глобальную переменную. Можно ли ее иным образом обнулить?
Код:
lock(SyncObject) {
    try {
        var gbVar = project.GlobalVariables["[email protected]", "globVar1"];
        // перейти к неудачному выходу, если он уже инициализирован
        return null;
    } catch (KeyNotFoundException ex) {
        int defaultValue = 1;
        project.GlobalVariables.SetVariable("[email protected]", "globVar1", defaultValue);
        project.Variables["currentValue"].Value = defaultValue.ToString();
        //  перейти к хорошему выходу, если мы инициализированы
        return "ok";
    }
}
Код:
lock(SyncObject) {
    var gbVar = project.GlobalVariables["[email protected]", "globVar1"];
    gbVar.Value = Convert.ToInt32(gbVar.Value.ToString())+1;
    project.Variables["currentValue"].Value = gbVar.Value.ToString();
}
 

Вложения

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63

Вложения

evegod

Новичок
Регистрация
27.06.2018
Сообщения
11
Благодарностей
0
Баллы
1
Подскажите пожалуйста, как обнулить переменную в многопотоке один раз и чтобы другие потоки не пошли по новому кругу ( так как переменная обнулена)

Я понимаю, что нужно обнулить переменную и чтобы первый поток который добрался до обнуления ждал в локе, а потом туда доедут все другие потоки и шаблон заканчивал работу
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Подскажите пожалуйста, как обнулить переменную в многопотоке один раз и чтобы другие потоки не пошли по новому кругу ( так как переменная обнулена)

Я понимаю, что нужно обнулить переменную и чтобы первый поток который добрался до обнуления ждал в локе, а потом туда доедут все другие потоки и шаблон заканчивал работу
можно break по условию использовать и все потоки остановятся
 

evegod

Новичок
Регистрация
27.06.2018
Сообщения
11
Благодарностей
0
Баллы
1
можно break по условию использовать и все потоки остановятся
А можно пример?

Ещё такой вопрос. Когда один поток добирается до обнуления. В этот момент в шабе будут работать потоки которые доеделывают свои дела и потоки которые спешат к проверке. Не все потоки необходимо останалирвать. Как вообще ориентирвоаться в потоках?
 

serg1208

Client
Регистрация
17.04.2018
Сообщения
331
Благодарностей
15
Баллы
18
тема умерла
 

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