|
Модераторы: Partizan, gambit |
|
bumbastic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 8.5.2007 Репутация: нет Всего: 1 |
Здравствуйте.
Вот я читал книжку Рихтера, там при описании метода Lock() сказано, что используется блок синхронизации, аналог критической секции. А что это такое? Ну вот написал я в коде
ну и что? Индекс блока синхронизации для this установился, указывает на какой-то блок синхронизации. Другие потоки в this не доберутся, допустим. А где блок синхронизации? Это область памяти для чего, что в ней хранится, как она используется? Код внутри Lock(this) {...} туда переписывается что-ли? Объясните мне прочитанное мной же. |
|||
|
||||
Mymik |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1474 Регистрация: 12.5.2006 Где: Lamer-центер Репутация: 1 Всего: 78 |
bumbastic, lock запрещает обращение к данным объекта (в твоем случаи this) из других потоков. Т.е. если у тебя дофига потоков есть. Пока выполняется код в блоке кода lock объект this будет недоступен извне.
-------------------- |
|||
|
||||
bumbastic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 8.5.2007 Репутация: нет Всего: 1 |
это понятно. Непонятно как это обеспечивается?
вот цитата из статьи на realcodinge "Каждый объект в каркасе .NET Framework может использоваться в качестве синхронизирующей секции кода (критической секции). В пределах такой секции одновременно может выполняться только один поток. Если один поток уже выполняется внутри такой синхронизирующей секции кода, любые другие потоки, пытающиеся получить доступ к данной секции, блокируются (и ждут) до тех пор, пока выполняющийся поток не покинет эту секцию кода." Как я понял, имеется в виду, что "Каждый объект в каркасе .NET Framework" имеет индекс синхронизации (поле, содержащее ссылку на участок памяти - блок синхронизации, выделенный специально для этого объекта). Вот, к примеру, я написал Lock(myObject) {...} что при этом происходит? Поток входит в секцию кода {...} и что-то делает. При этом myObject имеет указатель на блок синхронизации, выделенный ему CLR. Что хранит блок синхронизации? Как и кто пользуется этим блок синхронизации? |
|||
|
||||
tol05 |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Почитай еще статью http://www.microsoft.com/Rus/Msdn/Magazine.../InsideNet.mspx
может поможет? ИМХО Блок синхронизации - это структура данных, а не блок кода. Просто при каждом обращении к объекту CLR проверяет, обладает ли объект этими данными (поле индекса синхронизации имеет ссылку на какой-нибудь блок данных(блок синхронизации) из массива блоков синхронизации, который CLR создает при своей загрузке в Windows процесс). Если объект имеет ссылку, то его другие потоки не трогают. (Но все время интересуются, когда объект станет ненужным, ну, чтоб потрогать ) Ну вот, это я так понимаю. Хотелось бы и мне, честно говоря, послушать мнения других. Например, archeg-a... А ну, archeg, слабо вторую серию устроить? -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
bumbastic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 8.5.2007 Репутация: нет Всего: 1 |
ууу, шайтан, хитрый какой!
Спасибо, tol05, огромное!! А вот что остальные потоки делают, если им в доступе к объекту отказывают? Приостанавливаются? И можно какой-нибудь пример, для закрепления материала? |
|||
|
||||
tol05 |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Да, потоки просто приостанавливаются и ожидают доступа к объекту.
Как ты понимаешь, дальше не идут (по методу раз нельзя выполнить код, то и не надо! Нам-то и хотелось-то не очень! ) Ну вот, например, такой код:
Сейчас синхронизация доступа к SharedObject выключена. Раскомментай lock, запусти, почитай сообщения, сравни сообщения, цифры . Удачи. Это сообщение отредактировал(а) tol05 - 19.5.2007, 20:45 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
archeg |
|
|||
Опытный Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
Полностью совпадает с твоим, tol05 При исполнении Monitor.Enter(..) объект, переданый в параметрах связывается с блоком синхронизации. Блок синхронизации может увеличиватся, если приложению нужно больше объектов синхронизировать. Во-время исполнения другого потока если объект, связаный с блоком синхронизации - поток приостанавливается, и ждет, пока поток взявший на себя синхронизацию не "отпустит" объект, благодаря Monitor.Exit(..) Это сообщение отредактировал(а) archeg - 19.5.2007, 22:57 -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
bumbastic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 8.5.2007 Репутация: нет Всего: 1 |
Большое спасибо tol05 еще раз. Пример прикольный, ковыряю его потихоньку, дописываю разные варианты!
Arched - что ты имеешь в виду когда говоришь
Разве на каждый новый объект (если их становится больше) не выделяется отдельный блок синхронизации? Какой "блок синхронизации может увеличиватся", какого объекта? |
|||
|
||||
archeg |
|
|||
Опытный Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
Сорри, плохо выразился. Имел ввиду что масив блоков синхронизации может увеличиватся по надобности. -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [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. |