Многопоточное чтение файла - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Есть задача: читать большой файл блоками в x байт и потом с этими блоками что-то делать. Процессы чтения и делания нужно распараллелить, при этом сделать так, что б все работало быстро и оптимально. Делать все нужно при помощи thread'ов. Подскажите, пожалуйста, я правильно понимаю алгоритм: 1) создаем потоков по числу процессоров. 2) один поток направляем на чтение файла. Файл он должен считывать в некий буффер (что выбрать в качестве такого буфера? массив, лист или еще что-то?). что делать когда буфер заполнен? поток нужно усыплять и активизировать как только буфер освободится? 3)остальные потоки заставляем читать буфер и делать нужную им работу. все так?

Решение задачи: «Многопоточное чтение файла»

textual
Листинг программы
  1. class BuffersPool
  2. {
  3.     private Stack<byte[]> _buffers = new Stack<byte[]>();
  4.     private object _locker = new object();
  5.    
  6.     public BuffersPool(int bufferSize, int count)
  7.     {
  8.         for (int i = 0; i < count; i++)
  9.         {
  10.             _buffers.Push(new byte[bufferSize]);
  11.         }  
  12.     }
  13.    
  14.     public byte[] WaitForBuffer()
  15.     {
  16.         lock (_locker)
  17.         {
  18.             while (!_buffers.Any())
  19.             {
  20.                 Monitor.Wait(_locker);
  21.             }
  22.            
  23.             return _buffers.Pop();
  24.         }
  25.     }
  26.    
  27.     public void PutBack(byte[] buffer)
  28.     {
  29.         lock (_locker)
  30.         {
  31.             _buffers.Push(buffer);
  32.             Monitor.Pulse(_locker);
  33.         }
  34.     }
  35. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут