#c# #thread-safety #buffer-manager
#c# #потокобезопасность #менеджер буферов
Вопрос:
Я создаю диспетчер буферов через статический элемент BufferManager.CreateBufferManager
. Это новое созданное BufferManager
используется несколькими потоками.
Должен ли я использовать lock
с TakeBuffer()
и ReturnBuffer()
или это потокобезопасно по дизайну?
Ответ №1:
Внутренне BufferManager.CreateBufferManager
возвращает экземпляр WrappingBufferManager
, который не использует никакой формы управления параллелизмом, но оборачивает несколько экземпляров, SynchronizedPool<T>
которые используют внутреннюю блокировку при Take()
вводе нового буфера. Итак, судя по простоте WrappingBufferManager
, можно с уверенностью предположить, что любая блокировка с вашей стороны была бы избыточной, и возвращаемый класс на самом деле потокобезопасен.
Ответ №2:
У меня возникли проблемы с потоками с BufferManager. Я создал пользовательский кодировщик сообщений в WCF, и, по моим наблюдениям, не всегда гарантируется, что менеджер буферов создается для каждого вызова. Следовательно, байты повторно используются / возвращаются другими потоками, тем самым повреждая мои данные.
Итак, чтобы ответить на ваш вопрос… Нет, это НЕ ТАК. Поскольку вы повторно используете один и тот же экземпляр, их потокобезопасность не гарантируется.