Предположим, что у нас есть MethodA и MethodB, где тела целых методов находятся в одном большом блоке блокировки. Оба метода используют один и тот же объект для блокировки:Lock() {...} wait time
lock (objectX)
{
// methodbody
}
Существует несколько потоков, которые называют эти два метода.
Два вопроса:
- Можно ли измерить общее время ожидания? В том числе: время, необходимое для блокировки и времени, требуемого блокировкой блокировки «другого» метода для завершения выполнения.
- Быстро ли вводить блокировки в обоих методах в соответствующих местах вместо инкапсуляции всего тела метода с помощью одного замка? Я понимаю, что здесь мне нужно измерить производительность обоих решений, но я хотел бы услышать ваш опыт и рекомендации
«Всегда держите запертые сегменты как можно короче». действительно должно быть «Держать заблокированные сегменты как можно короче, не внося чрезмерного блокировки», нет? Захват - это не операция с нулевой стоимостью. –
@ChrisShain Monitor.Enter() очень дешев, когда нет споров. Но да, очень маленькие сегменты - тоже не очень хорошая идея. Это компромисс между переключением контекста и ненужным ожиданием. –
«Всегда держите запертые сегменты как можно короче». Я думаю, стоит отметить, что вы никогда не должны делать их короче. Если вам нужно сделать операцию атома с помощью 'lock', вам нужно включить всю операцию в эту' lock', а не разделить ее на несколько сегментов. – svick