Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/30: Рейтинг темы: голосов - 30, средняя оценка - 4.53
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Важно ли какой объект используется в lock?

26.03.2019, 03:42. Показов 5746. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Важно ли какой объект используется в lock? Если да, то когда и почему?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.03.2019, 03:42
Ответы с готовыми решениями:

Способ определить, что объект obj1 используется как объект синхронизации в текущий момент
Привет. Существует ли способ определить, что объект obj1 используется как объект синхронизации в текущий момент? т.е. есть конструкция...

Вывести на экран в символическом виде состояние NUM LOCK, CAPS LOCK и SCROLL LOCK
Помогите решить задачку на турбо си Выводить на экран в символическом виде состояние NUM LOCK, CAPS LOCK и SCROLL LOCK (вкл. / выкл.),...

Acer aspire 5552G-N974G64Mikk Проблема с Caps Lock, Num Lock, Scroll Lock
Вообщем у меня такая же проблемма https://www.cyberforum.ru/notebooks/thread552722.html Небольшая проблема на ноутбуке, когда...

17
Эксперт .NET
 Аватар для Usaga
14314 / 9400 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
26.03.2019, 06:42
Соколиный глаз, единственное, что важно - не использовать для блокировки сам объект, в котором происходит блокировка, и держать маркер блокировки приватным. Это для защиты от deadlock'ов.
2
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
26.03.2019, 07:29  [ТС]
Usaga, а зачем вообще в lock требуется переменная блокировки? Почему нельзя без неё обойтись было? Я не понимаю этого.
0
Эксперт .NET
 Аватар для Usaga
14314 / 9400 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
26.03.2019, 07:35
Соколиный глаз, наверное потому, что вам может потребоваться произвольное количество не связанных друг с другом блокировок?
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
26.03.2019, 07:57  [ТС]
Usaga, погодите, хорошо, а что происходит с тем обектом, который указан в lock? Как на него влияет lock?
0
Эксперт .NET
 Аватар для Usaga
14314 / 9400 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
26.03.2019, 08:07
Лучший ответ Сообщение было отмечено Соколиный глаз как решение

Решение

Соколиный глаз, у всех Object есть специальное поле SyncBlock, где и выставляется признак того, висит на нём блокировка, али нет. Самому объекту от этого ни холодно, ни жарко.
2
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
26.03.2019, 09:06
Всем доброе утро.
В данном вопросе более важно, что конструкция lock в общем и целом устарела.
Её нужно применять, только если в "рабочий код" выполняется синхронно.
А в современных условиях "рабочий код" может быть асинхронным.
Возьмём пример из Метанита:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    class Program
    {
        static int x = 0;
        // static object locker = new object(); //  для синхронной спячки
 
        private static readonly SemaphoreSlim locker = new SemaphoreSlim(1, 1); //  для асинхронной спячки
 
        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++)
            {
                Thread myThread = new Thread(Count);
                myThread.Name = "Поток " + i.ToString();
                myThread.Start();
            }
 
            Console.ReadLine();
        }
        public async static void Count()
        {
            //lock (locker) //  для синхронной спячки
            //{
            await locker.WaitAsync(); //  для асинхронной спячки
 
            x = 1;
            for (int i = 1; i <= 8; i++)
            {
                Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: {x}");
                x++;
                // Thread.Sleep(100); // синронная спячка - https://metanit.com/sharp/tutorial/11.4.php
                await Task.Delay(100);  // асинхронная спячка - Невозможное ожидание в теле оператора lock
            }
            locker.Release(); // для асинхронной спячки
            //}
        }
    }
Добавлено через 43 минуты
Самое интересное, что фигурные скобки можно имитировать конструкцией using { }

Есть много одинаковых реализаций AsyncLock от разных производителей, которые надо доустанавливать. Но применение у них у всех понятное.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using NeoSmart.AsyncLock;
using System;
using System.Threading;
using System.Threading.Tasks;
 
namespace Question2425501_AsyncLock
{
    class Program
    {
        static int x = 0;
        // static object locker = new object(); //  для синхронной спячки
 
        //private static readonly SemaphoreSlim locker = new SemaphoreSlim(1, 1); //  для асинхронной спячки
        static AsyncLock locker = new AsyncLock(); // NeoSmart.AsyncLock
        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++)
            {
                Thread myThread = new Thread(Count);
                myThread.Name = "Поток " + i.ToString();
                myThread.Start();
            }
 
            Console.ReadLine();
        }
        public async static void Count()
        {
            //lock (locker) //  для синхронной спячки
            //{
            //await locker.WaitAsync(); //  для асинхронной спячки
            using (await locker.LockAsync()) // NeoSmart.AsyncLock
            {
                x = 1;
                for (int i = 1; i <= 8; i++)
                {
                    Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: {x}");
                    x++;
                    // Thread.Sleep(100); // синронная спячка - https://metanit.com/sharp/tutorial/11.4.php
                    await Task.Delay(100);  // асинхронная спячка - Невозможное ожидание в теле оператора lock
                }
                //} //  для синхронной спячки
                //locker.Release(); // для асинхронной спячки
            } // NeoSmart.AsyncLock
 
        }
    }
}
1
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
26.03.2019, 11:54
Цитата Сообщение от amr-now Посмотреть сообщение
конструкция lock в общем и целом устарела
В каком плане устарела?

А как тогда решать классическую задачу с монопольным доступом к общей переменной из нескольких потоков? Т.е. когда нужно проверить значение и после модифицировать его, гарантируя, что между проверкой и изменением значение этой переменной не будет изменено из другого потока.
0
Эксперт .NET
 Аватар для Usaga
14314 / 9400 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
26.03.2019, 12:20
Мне тоже такая формулировака не нравится.

Цитата Сообщение от kotelok Посмотреть сообщение
А как тогда решать классическую задачу с монопольным доступом к общей переменной из нескольких потоков?
Такое решается в неблокирующем стиле (ну, если можно, конечно) с помощью Interlocked.CompareExchange.
3
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
26.03.2019, 12:53
Цитата Сообщение от kotelok Посмотреть сообщение
классическую задачу с монопольным доступом
Или можно поиграться с классом ReaderWriterLockSlim
Свобода творчества и самовыражения. Сейчас очень богатый выбор управления НЕсинхронно исполняющимися разными участками рабочего кода. По сравнению с началом 2000-х небо и земля.
Причём идеи и алгоритмы наприлетали и из Java и других языков.
2
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
29.03.2019, 03:42  [ТС]
То есть объект в lock - это по сути просто флаг заблокирован ли какой то участок кода?
0
Эксперт .NET
 Аватар для Usaga
14314 / 9400 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
29.03.2019, 04:08
Соколиный глаз, нет. Флаг выставляется у объекта в его специальном поле. А сам объект может выступать маркером блокировки в разных участках кода одновоременно.
2
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
29.03.2019, 07:11
Цитата Сообщение от amr-now Посмотреть сообщение
В данном вопросе более важно, что конструкция lock в общем и целом устарела.
Цитата Сообщение от amr-now Посмотреть сообщение
NeoSmart.AsyncLock
Который под капотом использует тот же lock
1
Эксперт .NET
 Аватар для Usaga
14314 / 9400 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
29.03.2019, 07:31
TopLayer, судя по исходникам - да, это так.
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
29.03.2019, 08:56
Цитата Сообщение от TopLayer Посмотреть сообщение
Который под капотом использует тот же lock
lock синтаксический сахар для Monitor:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    public unsafe void Dispose()
    {
        object obj2;
        bool flag;
        obj2 = this._parent._reentrancy;
        flag = 0;
    Label_000E:
        try
        {
            Monitor.Enter(obj2, &flag);
            Interlocked.Decrement(&this._parent._reentrances);
            if (this._parent._reentrances != null)
            {
                goto Label_0067;
            }
            this._parent._owningId = NeoSmart.AsyncLock.AsyncLock.UnlockedThreadId;
            if (this._parent._retry.CurrentCount != null)
            {
                goto Label_0067;
            }
            this._parent._retry.Release();
        Label_0067:
            goto Label_0073;
        }
        finally
        {
        Label_0069:
            if (flag == null)
            {
                goto Label_0072;
            }
            Monitor.Exit(obj2);
        Label_0072:;
        }
    Label_0073:
        return;
    }
С Хабра что ли притащили эту саркастическую фразу?

Зачем извращать мысль, что для асинхронных участков кода lock НЕ подходит?

Добавлено через 7 минут
----
Примерно то же самое, если каждому, кто написал слово "lock", крутить пальцем у виска и спрашивать, зачем он везде пишет Monitor.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
29.03.2019, 10:25
Цитата Сообщение от amr-now Посмотреть сообщение
Зачем извращать мысль, что для асинхронных участков кода lock НЕ подходит?
lock на небольшое количество операций подходит и для асинхронного кода
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
29.03.2019, 12:13
Для несведующих просьба пояснить. Чем lock плох для асинхронных операций и почему он устарел?
0
Эксперт .NET
 Аватар для Usaga
14314 / 9400 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
29.03.2019, 12:15
Лучший ответ Сообщение было отмечено amr-now как решение

Решение

Рядовой, асинхронность - модно-молодёжно, lock - цацка пердунов-пенсионеров.

Добавлено через 40 секунд
А вообще, это какое-то противопоставление двух разных подходов и сравниваться оно не должно.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.03.2019, 12:15
Помогаю со студенческими работами здесь

Клавиатура мигает всеми тремя индикаторами Caps Lock, Scroll Lock и Num Lock и соответственно не работает!
Здравствуйте парни и девушки! Столкнулся с такой проблемой! Имеется клавиатура Genius Ergomedia 700! Так вот. Начал замечать интересную...

Сколькими способами могут распределиться по игровым комнатам 9 детей, если важно, какой ребенок в какой комнат
Здравствуйте. Задача: В домашнем детском саду 4 игровые комнаты. Дети могут играл в любой из них. Сколькими способами могут...

Работа с клавиатурой (клавиши num lock, caps lock, scroll lock)
определить состояние статуса клавиш &quot; num lock, caps lock,scroll lock &quot; с отображением и их измением на экране

Зачем оператору lock в качестве параметра нужен объект (object)
Зачем оператору lock в качестве параметра нужен объект (object) lock (lockObject) { //... }

Можно ли в разных lock() одновременно использовать один и тот же объект синхронизации
Можно ли в разных lock() одновременно использовать один и тот же объект синхронизации для доступа к разным ресурсам?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru