Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236

Многопоточность, чтение переменной, несколько lock

20.08.2015, 11:47. Показов 2818. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Смотрите, есть переменная, ее изменение происходит с помощью lock
C#
1
2
3
int count = 0;
// ...
lock (countLockObject) count++;
а если мне надо прочитать значение, причем не суть важно на сколько оно будет точным (плюс минус как говорится), можно это делать без lock? не произойдет ни какой ошибки?
мне надо в лог выводить его, по этому и не важно на сколько оно точное.

Еще такой вопрос, если мне надо заблокировать несколько объектов, как быть, такая запись не работает:
C#
1
2
3
lock (objectA, objectB);
lock (objectA | objectB);
lock (objectA || objectB);
тут всего 2, но в реале их может быть 5 и более.


Еще такой вопрос, если пищу (разные объекты):
C#
1
2
3
4
lock (objectA)
{
    lock (objectB) count++;
}
это нормально?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.08.2015, 11:47
Ответы с готовыми решениями:

Lock не работает (многопоточность)
Здравствуйте. Есть такой код. namespace mysync { class Program { static void Main(string args) { ...

Многопоточность - синхронизация - lock
Изучаю многопоточность, дошел до синхронизация и не могу понять как использовать lock, вот делаю программу для теста lock: using...

Многопоточность, оператор Lock
У одном обучающем видеоролике, парень обьясняет что чтобы по частям среда не читала код из потока, нужно его взять в блок Lock, а вот для...

10
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
20.08.2015, 13:20
Цитата Сообщение от VLK Посмотреть сообщение
есть переменная, ее изменение происходит с помощью lock
Я бы использовал Interlocked.Increment

Цитата Сообщение от VLK Посмотреть сообщение
а если мне надо прочитать значение, причем не суть важно на сколько оно будет точным (плюс минус как говорится), можно это делать без lock? не произойдет ни какой ошибки?
Можно читать без lock. Ошибки не будет т.к. чтение и запись int32 является атомарной операцией.

Цитата Сообщение от VLK Посмотреть сообщение
Еще такой вопрос, если мне надо заблокировать несколько объектов, как быть
Ты уже сам нашел решение с вложенными lock. Можно еще переписать код используя тот факт что lock компилируется в вызовы Monitor.Enter/Monitor.Exit.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
lock (obj)
{
    // действия внутри lock
    ...
}
 
// Преобразуется в
Monitor.Enter(obj);
try
{
    // действия внутри lock
    ...
}
finally
{
    Monitor.Exit(obj);
}
Тебе нужно написать аналогичный код для нескольких объектов. Или лучше заменить несколько блокировок одной чтобы не было риска попасть в ситуация взаимоблокировки (deadlock).
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
20.08.2015, 13:25  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Я бы использовал Interlocked.Increment
ну это в том случае когда надо только инкремент сделать, а когда надо проверить, больше / меньши и на основании этого сделать инкремент деинкремент
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.08.2015, 17:00
Цитата Сообщение от VLK Посмотреть сообщение
когда надо проверить, больше / меньши и на основании этого сделать инкремент деинкремент
У класса Interlocked много методов.
https://msdn.microsoft.com/en-... .110).aspx
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
20.08.2015, 17:29  [ТС]
insite2012, я знаю об этом классе, смотрел методы, но ни чего похожего не нашел, плохо смотрел?

надо проверить больше или меньше после чего выполнить или не выполнить операцию (если больше нуля сделать де инкремент)
0
 Аватар для rockandroll
16 / 16 / 8
Регистрация: 05.08.2015
Сообщений: 79
20.08.2015, 18:08
Цитата Сообщение от VLK Посмотреть сообщение
Еще такой вопрос, если мне надо заблокировать несколько объектов, как быть, такая запись не работает:
....
тут всего 2, но в реале их может быть 5 и более.
а почему так много объектов сразу? в один период времени с разных участков много обращений к ним?
просто если работа с этими объектами в(в параллельном режиме) идет в одном участке, то почему бы не заключить их ( эти операции) в один lock.

например:

C#
1
2
3
4
5
6
7
8
9
lock(object1)
{
   //.. take info from object1
   //.. take info from object2
   //.. take info from object3
   //.. take info from object4
   //.. take info from object5
   //.. take info from object6
}
если нет то приведите, пожалуйста, пример.
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
20.08.2015, 18:43  [ТС]
rockandroll, ну допустим там перебор страниц и ведется подсчет сколько 404, сколько что то содержать, сколько не содержат, сколько мне уже известны, уже 4 переменных, насчет одной переменной, да было так сначала потом я почему то переделал на много, уже не помню почему все пашет не хочу сейчас этот код еще раз переделывать, хотя там можно было бы всего 1 объект для lock использовать.
0
 Аватар для rockandroll
16 / 16 / 8
Регистрация: 05.08.2015
Сообщений: 79
20.08.2015, 18:48
Цитата Сообщение от VLK Посмотреть сообщение
все пашет не хочу сейчас этот код еще раз переделывать


мне было интересно с точки зрения best practice. а так, конечно, можно сделать по разному.

а как ты хранишь страницы с 404? разве это не список какой-нибудь будет?
с ответа понял что все идет как то в отдельные переменные, но почему такое решение. с чем связано
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
20.08.2015, 18:54  [ТС]
Цитата Сообщение от rockandroll Посмотреть сообщение
а как ты хранишь страницы с 404? разве это не список какой-нибудь будет?
там идет подсчет сколько страниц было 404, если 404 то происходит is_404++, а если не было 404 тогда is_404-- при этом если 404 слишком много, происходит прерывание цикла, а если is_404 = 0, тогда is_404-- не делается, как то так.

такая хрень что бы одно и тоже не писать несколько раз:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
protected State ParseController(bool result, ref object lock_obj, ref int count_controller, int break_controller)
{
    lock (lock_obj)
    {
        if (result)
        {
            count_controller++;
            if (count_controller > break_controller) return State.Break;
            return State.Continue;
        }
        else
        {
            if (count_controller > 0) count_controller--;
            return State.Normal;
        }
    }
}
0
 Аватар для rockandroll
16 / 16 / 8
Регистрация: 05.08.2015
Сообщений: 79
20.08.2015, 19:06
C#
1
ref object lock_obj
представляет из себя что-то большее чем object? его можно держать как приватную переменную текущего класса.


а вот по этому просто вопрос:
C#
1
ref int count_controller
правильно ли я понимаю что этот метод ParseController вызывается из разных потоков? а если так, то с разных потоков по идее count_controller может передаваться с разными значениями? разве что он вне потоковой вакханалии) но почему бы его не сделат глобальным полем и убрать из сигнатуры метода.


upd...

тем более lock_obj с припиской ref не имеет никакого смысла. он итак передается как ref
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
20.08.2015, 19:10  [ТС]
Цитата Сообщение от rockandroll Посмотреть сообщение
представляет из себя что-то большее чем object?
нет, это object который создан только для lock под конкретную переменную.

count_controller это как раз и есть is_404, is_empty и т.д.
да, ParseController вызывается из разных потоков, но он и работает с разными переменными, по этому я и передаю по ref
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.08.2015, 19:10
Помогаю со студенческими работами здесь

Многопоточность, чтение и запись переменной типа стринг
всем привет! реализовал небольшой алгоритм, суть задания была в следующем: Реализовать «синхронные» методы чтения/записи для...

Вывести на экран в символическом виде состояние 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 Небольшая проблема на ноутбуке, когда...

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru