Страницы

Поиск по вопросам

понедельник, 8 апреля 2019 г.

Нужен ли lock в этом коде?

Подскажите пожалуйста нужен ли lock в этом коде, если я собираюсь использовать его в Parallel.ForEach? Пример кода с lock:
private IEnumerable<(Byte[] part_bytes, Int32 part_number)> GetPartsFile(FileStream file_stream) { file_stream.Seek(offset: 0, origin: SeekOrigin.Begin); for (Int32 index = 0, part_number = 0; index < file_stream.Length; index += DefaultCopyBufferSize, part_number++) { lock (this) { Byte[] bytes = new Byte[DefaultCopyBufferSize]; Int32 readed_bytes = file_stream.Read(array: bytes, offset: index, count: DefaultCopyBufferSize); if (readed_bytes < DefaultCopyBufferSize) { Byte[] end_bytes = new Byte[readed_bytes]; Buffer.BlockCopy(src: bytes, srcOffset: 0, dst: end_bytes, dstOffset: 0, count: readed_bytes); yield return (end_bytes, part_number); } else { yield return (bytes, part_number); } } } }
Пример использования в Parallel.ForEach:
Parallel.ForEach( source: GetPartsFile(file_stream: zip_file), body: tuple => { //тут ещё какие то действия });


Ответ

Именно для работы метода Parallel.ForEach оператор lock в этом коде не нужен.
Параметр source - источник - выполняется в одном потоке. А вот body - тело - может выполняться в нескольких потоках (а может и в одном).

Отмечу, что блокировака на this является опасной. Если кто-либо ещё возьмёт лок на этот же объект этого класса, то это может привести к дедлоку.

Комментариев нет:

Отправить комментарий