Собственно сабж в следующем коде:
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;
}
Здравствуйте, Аноним, Вы писали:
А>Собственно сабж в следующем коде:
А>А>
Какие дедлоки в одном потоке-то? Прочтите хоть, как монитор работает.
С уважением, Анатолий Попов.
ICQ: 995-908
Здравствуйте, Aen Sidhe, Вы писали:
AS>Какие дедлоки в одном потоке-то? Прочтите хоть, как монитор работает.
Во-первых, никто не ограничивал кол-во потоков для вызова Inc.
Во-вторых, мне все равно непонятно почему конструкция вида
private static readonly object _locker1 = new object();
lock (_locker1)
{
lock (_locker1)
{
//do some tasks
}
}
не вызывает deadlock на выделенной строке. Ведь мы уже установили флаг на _locker1. И следующая попытка установки флага должна ожидать до тех пор, пока флаг на этом объекте не будет снят. Если вас не затруднит, дайте ссылочку почитать то, что я не понимаю.
Здравствуйте, Аноним, Вы писали:
А>Ведь мы уже установили флаг на _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
С уважением, Анатолий Попов.
ICQ: 995-908