Особенности использования стандартных lock'ов для многопотока

elakeri

Client
Регистрация
23.07.2018
Сообщения
203
Благодарностей
10
Баллы
18
Да, будет работать, в том числе со всеми шаблонами, которые подключены к данной библиотеке (из которой используется локер), независимо от того, как и сколько процессов использует сама ZP для нужд исполнения потоков.
Важная ремарка: так работает только в том случае, если библиотека лежит в ExternalAssemblies в директории с зеннкой, и просто подключена к этим шаблонам через "Ссылки из GAC".
Если использовать функцию "Публикация" ("Опубликовать проект" при вызове контекстного меню по названию шаблона в ProjectMaker), чтобы запаковать шаблон и библиотеку в единый файл с расширением ".zp" - то у каждого такого шаблона будет свой вариант библиотеки, т.е. локер будет работать только для потоков конкретного запакованного шаблона.
То есть, при дефолтном раскладе, когда шаблон выглядит так :
133179

и использует AllTime.dll по дефолтной директории, {-Project.Directory-}my\myApp\bin\Debug\AllTime.dll, то локер не будет корректно работать?.. и надо его пихать в ExternalAssemblies и подключать через "Ссылки из GAC"?.. Как то очень заморочено.. А если в общем коде локеров своих набабахать, они будут работать в рамках шаба? Вот здесь
C#:
public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
    }
 

elakeri

Client
Регистрация
23.07.2018
Сообщения
203
Благодарностей
10
Баллы
18
но и смысл в том, что когда запускаешь в 1000 потоков такой код, допустим
C#:
public class Program : IZennoExternalCode
{
    public static object loker = new object();
    /// <summary>
    /// Метод для запуска выполнения скрипта
    /// </summary>
    /// <param name="instance">Объект инстанса выделеный для данного скрипта</param>
    /// <param name="project">Объект проекта выделеный для данного скрипта</param>
    /// <returns>Код выполнения скрипта</returns>       
    public int Execute(Instance instance, IZennoPosterProjectModel project)
    {
        int executionResult = 0;
        lock (loker)
        {
            for (int i = 0; i < 10; i++)
            {
                
                for (int j = 0; j < 100000; j++)
                {
                    //типа нагрузка, чтобы еще процесс выделил
                }
                Thread.Sleep(1000);
                project.SendInfoToLog(i.ToString(), true);
            }
            
        }
        return executionResult;
    }
}
, то в логе нет никакой путаницы, все четко по очереди считает до 10. Получается он в одном процессе 1000 поток организовал?, хотя в настройках 10 потоков на процесс, или все же несколько процессов, но они как то видят этот статичный лок. неразбериха
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
244
Благодарностей
974
Баллы
93
То есть, при дефолтном раскладе, когда шаблон выглядит так :
Вижу что у вас работа со студией через соответствующий экшен. Тут к сожалению не смогу подсказать ничего, так как этот кубик ни использовал, и не планирую по ряду причин (по крайней мере до появления ZP8 ). Возможно, кто-то другой подскажет, кто пользуется, либо через тесты. Ну и в ТП можно тоже поспрашивать, там думаю могут подробнее рассказать, как именно в данном случае работает и как избежать проблем.
 
  • Спасибо
Реакции: elakeri

elakeri

Client
Регистрация
23.07.2018
Сообщения
203
Благодарностей
10
Баллы
18

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