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

  • Автор темы Автор темы nomarketing
  • Дата начала Дата начала
хаос в вашем ожидании от работы глобальных переменных.
все работает как нужно)
 
запустил проект rostonix, нормально работает, если в настройках постера количество потоков в одном процессе поставлено на 1. Если больше, то начинаются глюки. Пожалуйста добавьте в настройки постера возможность поставить паузу между инициализациями потоков.
 
запустил проект rostonix, нормально работает, если в настройках постера количество потоков в одном процессе поставлено на 1. Если больше, то начинаются глюки. Пожалуйста добавьте в настройки постера возможность поставить паузу между инициализациями потоков.
Если там пример с локом обьекта, то работает нормально на сколько я помню.
 
интересная у вас тут тема развелась
я тоже когдато долго вникал в тему ассинхронного кода.
Да, все так и есть, rostonix правильно пишет.
В ассинхронном исполнении кода не должно быть порядка. Там где наступает порядок означает, что возникает очеред в виде стека или списка задач.
Очень удачная анология про метро: многопоток это люди только спускающеся в в метро, стремящиеся к турникету, а список задач это люди уже в очереди к турнекету. Даже если им выдать по номерку но пустить в метро всех сразу, то в итоге все равно очередь будет не упорядочена. Чтобы очередь была полностью упорядоченна, нужно дождаться последнего человека и только тогда упорядочивать.
То есть проблема порядка в определенной части логического процесса решается ожиданием определенного сигнала, который означает что все все процессы стали в очередь.
Только после того как все процессы находятся в одинаковом состоянии образуется типа упорядочивания и перевод их в однопоточный режим до тех пор пока все процессы не пройдут этот тонкий мостик синхронности.
Все это можно сделать с помощью глобальных переменных и ожидания.
1 счетчик процессов для многпоточной части - уже есть.
1 итератор процессов для однопоточной части - похож на первый, но назначение и логика работы другая.
 
интересная у вас тут тема развелась
я тоже когдато долго вникал в тему ассинхронного кода.
Да, все так и есть, rostonix правильно пишет.
В ассинхронном исполнении кода не должно быть порядка. Там где наступает порядок означает, что возникает очеред в виде стека или списка задач.
Очень удачная анология про метро: многопоток это люди только спускающеся в в метро, стремящиеся к турникету, а список задач это люди уже в очереди к турнекету. Даже если им выдать по номерку но пустить в метро всех сразу, то в итоге все равно очередь будет не упорядочена. Чтобы очередь была полностью упорядоченна, нужно дождаться последнего человека и только тогда упорядочивать.
То есть проблема порядка в определенной части логического процесса решается ожиданием определенного сигнала, который означает что все все процессы стали в очередь.
Только после того как все процессы находятся в одинаковом состоянии образуется типа упорядочивания и перевод их в однопоточный режим до тех пор пока все процессы не пройдут этот тонкий мостик синхронности.
Все это можно сделать с помощью глобальных переменных и ожидания.
1 счетчик процессов для многпоточной части - уже есть.
1 итератор процессов для однопоточной части - похож на первый, но назначение и логика работы другая.
Все верно, я пока понимал в чем суть, хотя я тогда первый раз с потоками столкнулся, это было чесно говоря не много сложно из за недопонимания самого процесса их работы, но когда ты понимаеш как они работают, проблема исчезает, своего рода, называется прирурчить потоки :)
 
нет, это называется, не приручить потоки, а приручить себя: понять логику работы программ..
;)
 
нет, это называется, не приручить потоки, а приручить себя: понять логику работы программ..
;-)
Ну я приручал потоки приручая себя понять их логику так как изначально я не имел представление как они работают, хотя имел, думая что они все идут поочередно :) а не в разброс :) в итоге моя логика построение логических действий была ошибочна и приводила к отрицательным результатам по всему времени работы над созданием каких либо проэктов. Но когда ты понимаеш как они работаю, все становится ясным, но был еще один недостаток в знаний, это язык C#, я с ним раньше не сталкивался, ну он не такой тяжелый, рекомендуется знать хотя бы на базовом уровне.
 
Если глобальная переменная не инициирована она инициируется и получает значение 0. Не представляю как этот код у вас работает иначе.
 
Перерыл на форуме кучу тем про глобальные переменные и многопотоки. Многие ведут сюда, но я так и не нашел простого решения.
Единственный рабочий пример - на C# (http://zennolab.com/discussion/threads/mnogopotok-prostoj-primer.15888/page-2#post-97413)

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



Запустил его первый пример в 20 потоков - многие из них схватили сразу каждый переменную по 0,
ну и дальше наблюдались дубли и пропуски счетчика.
 
вот пример поправленный
анализируйте логигу шаблона. после смены глобальной переменной мы ее значение кидаем в локальную переменную и в проекте используем уже ее, если она нужна
После 2 запуска снипет не работает. Приходится закрывать зенку, что бы обнулить Глобальную переменную. Можно ли ее иным образом обнулить?
Код:
Развернуть Свернуть Копировать
lock(SyncObject) {
    try {
        var gbVar = project.GlobalVariables["rostonix@gmail.com", "globVar1"];
        // перейти к неудачному выходу, если он уже инициализирован
        return null;
    } catch (KeyNotFoundException ex) {
        int defaultValue = 1;
        project.GlobalVariables.SetVariable("rostonix@gmail.com", "globVar1", defaultValue);
        project.Variables["currentValue"].Value = defaultValue.ToString();
        //  перейти к хорошему выходу, если мы инициализированы
        return "ok";
    }
}

Код:
Развернуть Свернуть Копировать
lock(SyncObject) {
    var gbVar = project.GlobalVariables["rostonix@gmail.com", "globVar1"];
    gbVar.Value = Convert.ToInt32(gbVar.Value.ToString())+1;
    project.Variables["currentValue"].Value = gbVar.Value.ToString();
}
 

Вложения

Вложения

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

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

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

А можно пример?

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

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