Особенности использования стандартных 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
Сообщения
245
Благодарностей
1 000
Баллы
93
То есть, при дефолтном раскладе, когда шаблон выглядит так :
Вижу что у вас работа со студией через соответствующий экшен. Тут к сожалению не смогу подсказать ничего, так как этот кубик ни использовал, и не планирую по ряду причин (по крайней мере до появления ZP8 ). Возможно, кто-то другой подскажет, кто пользуется, либо через тесты. Ну и в ТП можно тоже поспрашивать, там думаю могут подробнее рассказать, как именно в данном случае работает и как избежать проблем.
 
  • Спасибо
Реакции: elakeri

elakeri

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

LaGir

Client
Регистрация
01.10.2015
Сообщения
245
Благодарностей
1 000
Баллы
93

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