![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Grambler |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
допустим есть сложный объект со ссылками на другие объекты
то если его поместить в lock то он будет полностью (со всеми вложенными объектами) заблокирован от изменения другими потоками в пределах lock ? lock(obj) { //обработка obj } |
|||
|
||||
| Ctrl |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.2.2008 Где: Tula Репутация: 6 Всего: 7 |
Ты неверно понимаешь принцип работы инструкции lock.
На самом деле она является синтаксической оберткой для вызовов Monitor.Enter(object obj) и Monitor.Exit(object obj) в рамках блоков try-finally. Причем данные методы принимают параметром ссылку на объект синхронизаиции. Важно понимать что объект синхронизации - это не тот объект, доступ к которому ты защищаешь, а точка соприкосновения конкурирующих потоков. Попробую привести такую аналогию... Помнишь игру, в которой все бегают вокруг стула пока музыка играет, а когда музыка прекращается, надо сесть на единственный стул. Так вот, обработка защищаемого объекта - это как раз сидение на стуле и злорадное похихикивание над теми, кто не успел. А объект синхронизации - это сам стул: с одной стороны без него нельзя, и чтобы выполнять обработку(сидеть и похихикивать) он должен быть, и кроме того он должен быть всем виден, с другой стороны самому стулу глубоко все-равно, он просто присутствует... Вот примерный вариант использования
p/s. Советую почитать Рихтера (критические секции - это как раз то, чем занимается lock). |
|||
|
||||
| vponomarov |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 11.8.2007 Где: Киев Репутация: 4 Всего: 12 |
Ctrl, я тебя правильно понял: пока не завершится выполнение кода внутри блока лок все обращения к объекту будут становиться в очередь?
а что будет при попытке изменения объектов, ссылки на которые записаны в членах заблокированого объекта? |
|||
|
||||
| ivashkanet |
|
||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Нет. Пока не завершиться выполнение блока все остальные будут ждать !в начале блока! пока он не освободиться. Пример со стулом грамотно и наглядно показывает, что это не так. В момент когда кто-то сидит на стуле (зашел в секцию lock (стул)) кто-то может его красить, пилить... Если продолжать аналогию со стулом: нам нужно поменять лампочку. Для этого нужен стул. Если стульев много, то лампочку может закрутить любой, попутно мешая другому. А если он один, то приходиться ждать его, пока не остановится. И еще раз:
|
||||
|
|||||
| Grambler |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
Ctrl, это я все и так знаю, но есть нюансы которые вызывают вопросы
в твоем примере guard выступает в роли объекта синхронизации и действительно obj и все его члены блокируются внутри
но если во втором потоке опустить lock то блокировке наступает конец вот пример в котором все работает как надо
но если в Set0() закоментить lock, то сразу вылетает "Попытка деления на нуль."
на самом деле задача у меня следующая есть объект, который редактируется в Propertygrid запускается поток который его должен подрючить, во время вздрючки в потоке объект должен быть заблокирован от изменений в Propertygrid Добавлено через 5 минут и 23 секунды как тогда защитить доступ к объекту на время выполнения метода ? |
||||||
|
|||||||
| ivashkanet |
|
||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Каждую критическую секцию оборачивать в СВОЙ lock!
|
||||
|
|||||
| Grambler |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
ivashkanet, а как быть с такой задачей ? у меня есть только одна идея: перед запуском потока обработки объекта клонировать его, т.к. это происходит в одном потоке GUI то пользователь не сможет его поменять через Propertygrid в момент клонирования. Поток уже будет работать с клоном |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Неплохой и самый быстрый, в плане разработки, вариант. Если объект твой, то можно создать его синхронизированную версию объекта и ложить в грид именно ее. |
|||
|
||||
| Grambler |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 22.12.2006 Репутация: нет Всего: нет |
||||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Grambler, нет, я имею ввиду класс-декортатор как это сделано для ArrayList:
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |