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

  • Автор темы Автор темы Mikhail B.
  • Дата начала Дата начала

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 449
Реакции
5 478
Баллы
113
Вот я залочил чтение, запись и паузу 5 сек. Значит ли это, что 5 сек будет список не доступен?
 
Вот я залочил чтение, запись и паузу 5 сек. Значит ли это, что 5 сек будет список не доступен?
Все что внутри лока будет задерживать доступ, любая манипуляция, в том числе и пауза.
 
Все что внутри лока будет задерживать доступ, любая манипуляция, в том числе и пауза.
У меня не работает. Это 100% инфа что должно работать?
У меня в цикле обращение к списку, его чтение, запись, и пауза. Весь цикл в локе, весь код в локе. Я чекаю прокси, и я хочу что бы первый поток имел приоритет на этот процесс и пока он не завершил этот чек, другие даже не начинали. Но когда я запускаю проект, то по оповещениям я вижу что другие потоки спокойно обращаются к списку. что вобще наводит на мысли того, что этот лок работает не корректно.
 
Да мне уже говорили, что локи лочат не все.
Такой lock(SyncObject) { ... } лочит всё. Впринципе, как и любой другой: SyncObjects.ListSyncer, SyncObjects.TableSyncer, SyncObjects.InputSyncer. Разница только в разграничении доступа к разным ресурсам.
 
Последнее редактирование:
Походу в этом проблема! Буду тестить смотреть!
Это стандартный лок, он распространяется на все работающие шаблоны в 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
А у меня стоит lock (SyncObjects.ListSyncer)
Походу в этом проблема! Буду тестить смотреть!
Это не имеет значения, рекомендую почитать подробнее о локах здесь:

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

i7RAY5R.png


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

Вложения

  • Оценить
Реакции: Mikhail B.
Да мне уже говорили, что локи лочат не все. Наверняка и темы есть на форуме. Код сделать можно, но не сегодня)
lock(Object ){ } - встроенное средство c#. К zenno прямого отношения не имеет и с багами ни как не может быть связанно. Так что скорее всего дело в логике. Но без кода - это как гадать на кофейной гуще
 
  • Оценить
Реакции: doc и Mikhail B.
Всем спасибо. Постестирую и отпишу.
 
Я попробую выразится иначе, а то может меня некоторые недопоняли. Мне надо отановить активность всех потоков кроме первого. Первый поток начинает работаь в локе со списком, ставит паузу, допустим она 20 сек, эта пауза в локе! Соотвественно другие потоки должны ждать, но этого не происходит. Почему?

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

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

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

Вложения

Последнее редактирование:
Я попробую выразится иначе, а то может меня некоторые недопоняли. Мне надо отановить активность всех потоков кроме первого. Первый поток начинает работаь в локе со списком, ставит паузу, допустим она 20 сек, эта пауза в локе! Соотвественно другие потоки должны ждать, но этого не происходит. Почему?

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

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

Шаблон приложил, снипеты там есть.
Логика вложенного шаба такова, что там всегда будет идти по ветке 0 потока
 
Логика вложенного шаба такова, что там всегда будет идти по ветке 0 потока
Ты ошибаешься. Если обнулена переменная то там все четко в многопотоке в плане разделения. Ведь мы говорим про многопоток. Иначе какой смысл от этого снипета в одном потоке.
 
Нужно
C#:
Развернуть Свернуть Копировать
lock(SyncObjects.ListSyncer)
Либо свои объекты как выше писали

https://cloud.mail.ru/home/2020-02-04_07-06-56.mp4?weblink=59Ac/2m9BUsAVd
Так тоже не работает. Хотя по видео работает. Мистика. Проверить смогу только вечером. Спасибо за подсказку.
 
  • Оценить
Реакции: Mikhail B.
Ты ошибаешься. Если обнулена переменная то там все четко в многопотоке в плане разделения. Ведь мы говорим про многопоток. Иначе какой смысл от этого снипета в одном потоке.
C#:
Развернуть Свернуть Копировать
lock(SyncObject) {
    try {
        var gbVar = project.GlobalVariables["rostonix@gmail.com", "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("rostonix@gmail.com", "globVar1", defaultValue);
        project.Variables["currentValue"].Value = defaultValue.ToString();
        // go to good exit if we initilized
        return "ok";
    }
}
этот код всегда идёт зеленой. Переменная не существует - зеленая. переменная 0 - зеленая. А другие условия из этих не появятся
 
C#:
Развернуть Свернуть Копировать
lock(SyncObject) {
    try {
        var gbVar = project.GlobalVariables["rostonix@gmail.com", "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("rostonix@gmail.com", "globVar1", defaultValue);
        project.Variables["currentValue"].Value = defaultValue.ToString();
        // go to good exit if we initilized
        return "ok";
    }
}
этот код всегда идёт зеленой. Переменная не существует - зеленая. переменная 0 - зеленая. А другие условия из этих не появятся
Мне можешь не объяснять. Я не особо шарю в шарпе. Этот снипет делает то что нужно. Запусти в многопотоке и сам увидишь.

А ну может глобалку создать забыл. Она же глобалка и работает если даже создана в другом шабе. Если ты про это.
 
Мне можешь не объяснять. Я не особо шарю в шарпе. Этот снипет делает то что нужно. Запусти в многопотоке и сам увидишь.

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

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

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