Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что такое блок синхронизации CLR? 
V
    Опции темы
bumbastic
Дата 19.5.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 8.5.2007

Репутация: нет
Всего: 1



Здравствуйте.
Вот я читал книжку Рихтера, там при описании метода Lock() сказано, что используется блок синхронизации, аналог критической секции. А что это такое? 
Ну вот написал я в коде
Код

Lock(this) {...}


ну и что? Индекс блока синхронизации для this установился, указывает на какой-то блок синхронизации.  Другие потоки в this не доберутся, допустим.
А где блок синхронизации? Это область памяти для чего, что в ней хранится, как она используется?
Код внутри Lock(this) {...} туда переписывается что-ли?

Объясните мне прочитанное мной же.  smile 
PM MAIL   Вверх
Mymik
Дата 19.5.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 1
Всего: 78



bumbastic, lock запрещает обращение к данным объекта (в твоем случаи this) из других потоков. Т.е. если у тебя дофига потоков есть. Пока выполняется код в блоке кода lock объект this будет недоступен извне. 


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
bumbastic
Дата 19.5.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 8.5.2007

Репутация: нет
Всего: 1



это понятно. Непонятно как это обеспечивается?
вот цитата из статьи на realcodinge

"Каждый объект в каркасе .NET Framework может использоваться в качестве синхронизирующей секции кода (критической секции). В пределах такой секции одновременно может выполняться только один поток. Если один поток уже выполняется внутри такой синхронизирующей секции кода, любые другие потоки, пытающиеся получить доступ к данной секции, блокируются (и ждут) до тех пор, пока выполняющийся поток не покинет эту секцию кода."

Как я понял, имеется в виду, что "Каждый объект в каркасе .NET Framework" имеет индекс синхронизации (поле, содержащее ссылку на участок памяти - блок синхронизации, выделенный специально для этого объекта). Вот, к примеру, я написал
Lock(myObject) {...}
что при этом происходит? Поток входит в секцию кода {...} и что-то делает. При этом myObject имеет указатель на блок синхронизации, выделенный ему CLR. Что хранит блок синхронизации? Как и кто пользуется этим блок синхронизации?

PM MAIL   Вверх
tol05
Дата 19.5.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Почитай еще статью http://www.microsoft.com/Rus/Msdn/Magazine.../InsideNet.mspx
может поможет?  

ИМХО Блок синхронизации - это структура данных, а не блок кода. 
Просто при каждом обращении к объекту CLR проверяет, обладает ли объект этими данными (поле индекса синхронизации имеет ссылку на какой-нибудь блок данных(блок синхронизации) из массива блоков синхронизации, который CLR создает при своей загрузке в Windows процесс).
Если объект имеет ссылку, то его другие потоки не трогают. 
(Но все время интересуются, когда объект станет ненужным, ну, чтоб потрогать  smile )

Ну вот, это я так понимаю. Хотелось бы и мне, честно говоря, послушать мнения других. Например, archeg-a...
А ну, archeg, слабо вторую серию устроить?  smile 




--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
bumbastic
Дата 19.5.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 8.5.2007

Репутация: нет
Всего: 1



ууу, шайтан, хитрый какой! smile

Спасибо, tol05, огромное!!

А вот что остальные потоки делают, если им в доступе к объекту отказывают? Приостанавливаются? 
И можно какой-нибудь пример, для закрепления материала?
PM MAIL   Вверх
tol05
Дата 19.5.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Да, потоки просто приостанавливаются и ожидают доступа к объекту. 
Как ты понимаешь, дальше не идут (по методу раз нельзя выполнить код, то и не надо! smile 
Нам-то и хотелось-то не очень!  smile )

Ну вот, например, такой код:
Код

using System;
using System.Threading;

namespace ThreadLocking
{
  class Program
  {
    static void Main(string[] args)
    {
      SharedObject obj = new SharedObject();

      Thread tr1 = new Thread(Work);
      Thread tr2 = new Thread(Work);
      Thread tr3 = new Thread(Work);

      tr1.Start(obj);
      tr2.Start(obj);
      tr3.Start(obj);
    }

    static void Work(object inputObject)
    {
      SharedObject obj = inputObject as SharedObject;
      while( true ) 
      {
        int threadId = Thread.CurrentThread.ManagedThreadId;

        Console.WriteLine("I'm a {0}. Are you at home?\n", threadId);
        //lock( obj )
        //{
          Console.WriteLine("I'm a {0}. Hi, SharedObject!  ", threadId);
          obj.Visit();
          Thread.Sleep(10000);
          Console.WriteLine("I'm a {0}. I'm going away!  ", threadId);
          obj.SayGoodbye();
        //}
      }
    }
  }

  class SharedObject
  {
    private int numberOfVisitors = 0;

    public void Visit()
    {
      numberOfVisitors++;
      Console.WriteLine("       Hi, visitor{0}! You are a {1}!\n", Thread.CurrentThread.ManagedThreadId, numberOfVisitors);
    }

    public void SayGoodbye()
    {
      Console.WriteLine("       Bye, visitor {0}! You was a {1}!\n", Thread.CurrentThread.ManagedThreadId, numberOfVisitors);
    }
  }
}

Сейчас синхронизация доступа к SharedObject выключена. Раскомментай lock, запусти, почитай сообщения, сравни сообщения, цифры smile.

Удачи.

Это сообщение отредактировал(а) tol05 - 19.5.2007, 20:45


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
archeg
Дата 19.5.2007, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 11
Всего: 27



Цитата(tol05 @  19.5.2007,  18:20 Найти цитируемый пост)
Ну вот, это я так понимаю. Хотелось бы и мне, честно говоря, послушать мнения других. Например, archeg-a...
А ну, archeg, слабо вторую серию устроить?   

Полностью совпадает с твоим, tol05  smile 

При исполнении Monitor.Enter(..) объект, переданый в параметрах связывается с блоком синхронизации. Блок синхронизации может увеличиватся, если приложению нужно больше объектов синхронизировать. Во-время исполнения другого потока если объект, связаный с блоком синхронизации - поток приостанавливается, и ждет, пока поток взявший на себя синхронизацию не "отпустит" объект, благодаря Monitor.Exit(..)



Это сообщение отредактировал(а) archeg - 19.5.2007, 22:57


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
bumbastic
Дата 20.5.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 8.5.2007

Репутация: нет
Всего: 1



Большое спасибо tol05 еще раз. Пример прикольный, ковыряю его потихоньку, дописываю разные варианты! smile

Arched - что ты имеешь в виду когда говоришь 
Цитата(archeg @  19.5.2007,  22:56 Найти цитируемый пост)
Блок синхронизации может увеличиватся, если приложению нужно больше объектов синхронизировать
?
Разве на каждый новый объект (если их становится больше) не выделяется отдельный блок синхронизации? Какой "блок синхронизации может увеличиватся", какого объекта?

PM MAIL   Вверх
archeg
Дата 20.5.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 11
Всего: 27



Цитата(bumbastic @  20.5.2007,  12:02 Найти цитируемый пост)
Arched - что ты имеешь в виду когда говоришь 
Цитата(archeg @  19.5.2007,  22:56 )
Блок синхронизации может увеличиватся, если приложению нужно больше объектов синхронизировать

?
Разве на каждый новый объект (если их становится больше) не выделяется отдельный блок синхронизации? Какой "блок синхронизации может увеличиватся", какого объекта?

Сорри, плохо выразился. Имел ввиду что масив блоков синхронизации может увеличиватся по надобности.


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1379 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.