Чтение, запись и пауза в локе. Будет работать?

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Вот я залочил чтение, запись и паузу 5 сек. Значит ли это, что 5 сек будет список не доступен?
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 075
Благодарностей
8 960
Баллы
113
Вот я залочил чтение, запись и паузу 5 сек. Значит ли это, что 5 сек будет список не доступен?
Все что внутри лока будет задерживать доступ, любая манипуляция, в том числе и пауза.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Все что внутри лока будет задерживать доступ, любая манипуляция, в том числе и пауза.
У меня не работает. Это 100% инфа что должно работать?
У меня в цикле обращение к списку, его чтение, запись, и пауза. Весь цикл в локе, весь код в локе. Я чекаю прокси, и я хочу что бы первый поток имел приоритет на этот процесс и пока он не завершил этот чек, другие даже не начинали. Но когда я запускаю проект, то по оповещениям я вижу что другие потоки спокойно обращаются к списку. что вобще наводит на мысли того, что этот лок работает не корректно.
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 551
Баллы
113
Да мне уже говорили, что локи лочат не все.
Такой lock(SyncObject) { ... } лочит всё. Впринципе, как и любой другой: SyncObjects.ListSyncer, SyncObjects.TableSyncer, SyncObjects.InputSyncer. Разница только в разграничении доступа к разным ресурсам.
 
Последнее редактирование:

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Походу в этом проблема! Буду тестить смотреть!
Это стандартный лок, он распространяется на все работающие шаблоны в ZP.
По хорошему, лучше создавать локи для каждой однотипной задачи запись/чтение.

C#:
namespace ZennoLab.OwnCode
{
    class Locker {

        public static object lstTxtProxy = new object(); // чтение прокси
        public static object sqliteGetData = new object(); // чтение базы
        public static object sqliteSetData = new object(); // запись базы

    }
}
И прописываешь
C#:
lock (Locker.lstTxtProxy) {...}
 
  • Спасибо
Реакции: volody00

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 551
Баллы
113
А у меня стоит lock (SyncObjects.ListSyncer)
Походу в этом проблема! Буду тестить смотреть!
Это не имеет значения, рекомендую почитать подробнее о локах здесь:

Вот пример, который отрабатывает корректно с локом (берем первый элемент списка, удаляем его и кладём в самый конец):



Каждый поток работает с своим значением. Проверьте у себя.
 

Вложения

  • Спасибо
Реакции: Mikhail B.

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 218
Благодарностей
779
Баллы
113
Да мне уже говорили, что локи лочат не все. Наверняка и темы есть на форуме. Код сделать можно, но не сегодня)
lock(Object ){ } - встроенное средство c#. К zenno прямого отношения не имеет и с багами ни как не может быть связанно. Так что скорее всего дело в логике. Но без кода - это как гадать на кофейной гуще
 
  • Спасибо
Реакции: doc и Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Всем спасибо. Постестирую и отпишу.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Я попробую выразится иначе, а то может меня некоторые недопоняли. Мне надо отановить активность всех потоков кроме первого. Первый поток начинает работаь в локе со списком, ставит паузу, допустим она 20 сек, эта пауза в локе! Соотвественно другие потоки должны ждать, но этого не происходит. Почему?

Снипет с паузой 20 сек в локе, для первого (нулевого) потока. Он выполняется 100% первый, но он никак не препятствует другим потокам обращатся к списку (а должен).
2020-02-04_071538.png

Снипет для остальных потоков, тоже с локом, но уже без паузы. Теоретически они должны ждать пока первый (нулевой) сделает свои дела, но этого не происходит (а должно).
2020-02-04_071558.png

Шаблон приложил, снипеты там есть.
 

Вложения

Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113
Я попробую выразится иначе, а то может меня некоторые недопоняли. Мне надо отановить активность всех потоков кроме первого. Первый поток начинает работаь в локе со списком, ставит паузу, допустим она 20 сек, эта пауза в локе! Соотвественно другие потоки должны ждать, но этого не происходит. Почему?

Снипет с паузой 20 сек в локе, для первого (нулевого) потока. Он выполняется 100% первый, но он никак не препятствует другим потокам обращатся к списку (а должен).
Посмотреть вложение 49549

Снипет для остальных потоков, тоже с локом, но уже без паузы. Теоретически они должны ждать пока первый (нулевой) сделает свои дела, но этого не происходит (а должно).
Посмотреть вложение 49550

Шаблон приложил, снипеты там есть.
Логика вложенного шаба такова, что там всегда будет идти по ветке 0 потока
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Логика вложенного шаба такова, что там всегда будет идти по ветке 0 потока
Ты ошибаешься. Если обнулена переменная то там все четко в многопотоке в плане разделения. Ведь мы говорим про многопоток. Иначе какой смысл от этого снипета в одном потоке.
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 218
Благодарностей
779
Баллы
113

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 218
Благодарностей
779
Баллы
113
  • Спасибо
Реакции: Mikhail B.

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113
Ты ошибаешься. Если обнулена переменная то там все четко в многопотоке в плане разделения. Ведь мы говорим про многопоток. Иначе какой смысл от этого снипета в одном потоке.
C#:
lock(SyncObject) {
    try {
        var gbVar = project.GlobalVariables["[email protected]", "globVar1"];
       
        if (gbVar.Value == "0"){
            throw new KeyNotFoundException("Нулевое значение");
        }
        // go to bad exit if already initilized
        return null;
    } catch (KeyNotFoundException ex) {
        int defaultValue = 0;
        project.GlobalVariables.SetVariable("[email protected]", "globVar1", defaultValue);
        project.Variables["currentValue"].Value = defaultValue.ToString();
        // go to good exit if we initilized
        return "ok";
    }
}
этот код всегда идёт зеленой. Переменная не существует - зеленая. переменная 0 - зеленая. А другие условия из этих не появятся
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
C#:
lock(SyncObject) {
    try {
        var gbVar = project.GlobalVariables["[email protected]", "globVar1"];
   
        if (gbVar.Value == "0"){
            throw new KeyNotFoundException("Нулевое значение");
        }
        // go to bad exit if already initilized
        return null;
    } catch (KeyNotFoundException ex) {
        int defaultValue = 0;
        project.GlobalVariables.SetVariable("[email protected]", "globVar1", defaultValue);
        project.Variables["currentValue"].Value = defaultValue.ToString();
        // go to good exit if we initilized
        return "ok";
    }
}
этот код всегда идёт зеленой. Переменная не существует - зеленая. переменная 0 - зеленая. А другие условия из этих не появятся
Мне можешь не объяснять. Я не особо шарю в шарпе. Этот снипет делает то что нужно. Запусти в многопотоке и сам увидишь.

А ну может глобалку создать забыл. Она же глобалка и работает если даже создана в другом шабе. Если ты про это.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113
Мне можешь не объяснять. Я не особо шарю в шарпе. Этот снипет делает то что нужно. Запусти в многопотоке и сам увидишь.

А ну может глобалку создать забыл. Она же глобалка и работает если даже создана в другом шабе. Если ты про это.
В общем, если вкратце, всю логику этих локов нужно объединять в один код. Потому что между их вызовами есть промежутки в которые могут просачиваться потоки. Либо думать над костыльным локом на кубиках, которым будешь ограничивать область шаблона. На форуме кто-то такое уже придумывал, правда нужно дорабатывать было
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
В общем, если вкратце, всю логику этих локов нужно объединять в один код. Потому что между их вызовами есть промежутки в которые могут просачиваться потоки. Либо думать над костыльным локом на кубиках, которым будешь ограничивать область шаблона. На форуме кто-то такое уже придумывал, правда нужно дорабатывать было
Я ставлю просто паузу и все отлично пашет. Проблем не замечал. Но обнулять переменную это запара конечно.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113
Я ставлю просто паузу и все отлично пашет. Проблем не замечал. Но обнулять переменную это запара конечно.
ну очевидно, что сейчас у тебя что-то работает не так, как хотелось
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
ну очевидно, что сейчас у тебя что-то работает не так, как хотелось
Речь в теме вобще не про этот снипет. Речь о локе который идет после него.
Но вроде Олег решил пооблему сменой типа лока. Я вечером только проверю.на основном сниппете.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113
Речь в теме вобще не про этот снипет. Речь о локе который идет после него.
Но вроде Олег решил пооблему сменой типа лока. Я вечером только проверю.на основном сниппете.
конкретно этот лок вообще тёмная лошадка. Когда-то я считал, что он пашет на все проекты. Потом узнал, что его область действия ограничивается одним проектом. Теперь мне кажется, что он общий только для завёрнутого в него участка кода
 
  • Спасибо
Реакции: Mikhail B.

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 218
Благодарностей
779
Баллы
113
конкретно этот лок вообще тёмная лошадка. Когда-то я считал, что он пашет на все проекты. Потом узнал, что его область действия ограничивается одним проектом. Теперь мне кажется, что он общий только для завёрнутого в него участка кода

Или ты имел ввиду SyncObject, который в общем коде?
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113

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