Почему не происходит deadlock?
От: Аноним  
Дата: 27.09.11 09:45
Оценка:
Собственно сабж в следующем коде:
protected static object _locker1 = new object();
protected static double Count { get; set; }

        private void IncInternal(int argi)
        {
            lock (_locker1)
            {
                Count += argi;
            }
        }

        private double Inc(object arg)
        {
            int argi = arg is int ? (int)arg : 0; 
            lock (_locker1)
            {
                IncInternal(argi);
            }

            return Count;
        }
lock
Re: Почему не происходит deadlock?
От: Aen Sidhe Россия Просто блог
Дата: 27.09.11 09:48
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Собственно сабж в следующем коде:

А>
А>


Какие дедлоки в одном потоке-то? Прочтите хоть, как монитор работает.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[2]: Почему не происходит deadlock?
От: Аноним  
Дата: 27.09.11 09:55
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

AS>Какие дедлоки в одном потоке-то? Прочтите хоть, как монитор работает.

Во-первых, никто не ограничивал кол-во потоков для вызова Inc.
Во-вторых, мне все равно непонятно почему конструкция вида

private static readonly object _locker1 = new object();

lock (_locker1)
{
  lock (_locker1)
  {
    //do some tasks
  }
}

не вызывает deadlock на выделенной строке. Ведь мы уже установили флаг на _locker1. И следующая попытка установки флага должна ожидать до тех пор, пока флаг на этом объекте не будет снят. Если вас не затруднит, дайте ссылочку почитать то, что я не понимаю.
Re[3]: Почему не происходит deadlock?
От: Lloyd Россия  
Дата: 27.09.11 10:01
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Ведь мы уже установили флаг на _locker1. И следующая попытка установки флага должна ожидать до тех пор, пока флаг на этом объекте не будет снят. Если вас не затруднит, дайте ссылочку почитать то, что я не понимаю.


Use Enter to acquire the Monitor on the object passed as the parameter. If another thread has executed an Enter on the object but has not yet executed the corresponding Exit, the current thread will block until the other thread releases the object. It is legal for the same thread to invoke Enter more than once without it blocking; however, an equal number of Exit calls must be invoked before other threads waiting on the object will unblock.


http://msdn.microsoft.com/en-us/library/de0542zz.aspx
Re[3]: Почему не происходит deadlock?
От: anomander  
Дата: 27.09.11 10:02
Оценка:
http://stackoverflow.com/questions/391913/re-entrant-locks-in-c
Re[3]: Почему не происходит deadlock?
От: Aen Sidhe Россия Просто блог
Дата: 27.09.11 10:12
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Aen Sidhe, Вы писали:


AS>>Какие дедлоки в одном потоке-то? Прочтите хоть, как монитор работает.

А>Во-первых, никто не ограничивал кол-во потоков для вызова Inc.

Во-первых, из сниппета, вами приведённого, это непонятно.

А>Во-вторых, мне все равно непонятно почему конструкция вида


Прочтите документацию про монитор.
С уважением, Анатолий Попов.
ICQ: 995-908
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.