Поточная обработка C# - Объект блокирования

Используйте приложение/JavaScript. Таким образом клиенты могут полагаться на тип контента, не имея необходимость вручную проверять, имеет ли ответ дополнение или нет.

16
задан paul simmons 17 August 2009 в 11:05
поделиться

5 ответов

Вам необходимо создать отдельный объект блокировки. Проблема в том, что вы повторно назначаете t_x внутри цикла. Предполагая, что поток b1 попадает внутрь цикла до того, как b2 переходит к оператору блокировки, b2 будет разрешен внутри оператора блокировки, потому что к тому времени t_x будет новым объектом, на котором не будет блокировки.

17
ответ дан 30 November 2019 в 16:05
поделиться

Нет, вы не можете этого сделать - блокировка является сокращением для следующего:

try(Monitor.Enter(lockObject))
{
    //critical section
}
finally
{
    Monitor.Exit(lockObject)
}

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

23
ответ дан 30 November 2019 в 16:05
поделиться

Вызов блокировки (t_x) помещает целое число в качестве временного объекта. Каждый вызов lock (t_x) создает новый объект, и блокировка бесполезна.

(Lock ожидает объект и создает НОВЫЙ временный объект из целого числа)

Просто создайте отдельный объект блокировки, как сказано выше Фемарефом.

2
ответ дан 30 November 2019 в 16:05
поделиться

Если вы действительно хотите (нужно?) Чтобы заблокировать объект, вы можете использовать своего рода оболочку:

public class IntWrapper
{
    public int Value{get;set;}
}

Или, если вам нужно оставаться более абстрактным:

public class ObjectWrapper
{
    public Object Value { get;set; }
}
0
ответ дан 30 November 2019 в 16:05
поделиться

Вы должны использовать дополнительный объект для блокировки

object lockObj = new object();
public void foo()
{
    lock(lockObj)
    {
    //do stuff here
    }
}
2
ответ дан 30 November 2019 в 16:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: