2009-10-29 4 views
1

после нескольких часов отслеживания таинственных один или две секунды длительное «замораживание» Я наконец узнал, что его ReaderWriterLock (-1). Это серверное приложение, и блокировка здесь хранится для записи в коллекцию клиентов. Я не знаком с блокировкой, поэтому я хотел бы спросить, нет ли лучшего/более быстрого способа? Как насчет использования объекта блокировки для блокировки операторов добавления/чтения? Это замораживание происходит очень случайным образом, но очень раздражает, поскольку оно вызывает отставание от всех подключенных клиентов. Спасибо!Медленное замедление: ReaderWriterLock (-1). Могу ли я использовать разные блокировки?

ответ

2

Возможно, вы имели в виду AcquireReaderLock(-1)/AcquireWriterLock(-1) или аналогичные? Это предполагает, что блокировка будет решена - в этом случае исправьте любой код, удерживающий блокировку (запись) в это время. Если задержка составляет буквально с классом блокировки, то возможноReaderWriterLockSlim будет иметь меньше накладных расходов. lock действительно будет проще (и, следовательно, дешевле), но не дает такой же гранулярности - это, по сути, блокировка мьютекса, поэтому только один поток может играть с объектом. Контраст блокировки чтения/записи, которая позволяет одному считывателю NAND несколько считывателей.

Если честно, это звучит так же просто, как «иногда, какой-то код будет блокировать запись (блокирование других абонентов) и займет некоторое время». Поиск оскорбительный код - это черное искусство, но оно имеет мало общего с самой блокировкой.

Смежные вопросы