Чтение фалов несколькими потоками thread

 
0
 
C++
ava
chetl | 28.10.2016, 07:58
Есть папка с 40 тысячами файлов. Необходимо считать их несколькими потоками. То как вижу реализацию программы я это сначала найти все 40 тыщ файлов, записать их адреса в вектор, а потом передать работу с ними четырем потокам, но хотелось бы распараллелить эту работу, если у меня  4 потока то для их работы нужно только 4 файла а не все 40 тыщ. Как сделать так чтобы программа параллельно искала файлы и в тоже время найденные файлы обрабатывали потоки, а не сначала искать все файлы а потом их обрабатывать?
Kommentare (2)
ava
xvr | 28.10.2016, 13:58 #
Делаете очередь (с блокировками по чтению), далее запускаете ваши 4 потока, которые читают из очереди по 1 элементу (имя файла) и обрабатывают. И последний (точнее первый) поток (основная программа) занимается сканированием папки и складыванием имен файлов в очередь.

Сама очередь выглядит как то так:

//---------------------------------------------------------------------------

#ifndef queueH
#define queueH
//---------------------------------------------------------------------------
#include <deque>

template<class Item>
class WQueue {
std::deque<Item> queue;

CRITICAL_SECTION cs;
HANDLE sema;
HANDLE not_emp_sig;

public:
WQueue(int max_size)
  {
   sema=CreateSemaphore(NULL,max_size,max_size,NULL);
   not_emp_sig=CreateEvent(NULL,FALSE,FALSE,NULL);
   InitializeCriticalSection(&cs);
  }
~WQueue()
  {
   CloseHandle(sema);
   CloseHandle(not_emp_sig);
   DeleteCriticalSection(&cs);
  }

void put(const Item& it)
  {
   WaitForSingleObject(sema,INFINITE);
   EnterCriticalSection(&cs);
   queue.push_back(it);
   SetEvent(not_emp_sig);
   LeaveCriticalSection(&cs);
  }

Item get()
  {
   for(;;)
    {
     WaitForSingleObject(not_emp_sig,INFINITE);
     EnterCriticalSection(&cs);
     if (queue.empty())
      {
       LeaveCriticalSection(&cs);
       continue;
      }
     Item rv=queue.front();
     queue.pop_front();
     if (!queue.empty()) SetEvent(not_emp_sig);
     ReleaseSemaphore(sema,1,NULL);
     LeaveCriticalSection(&cs);
     return rv;
    }
  }

size_t get_cur_size()
  {
   EnterCriticalSection(&cs);
   size_t rv=queue.size();
   LeaveCriticalSection(&cs);
   return rv;
  }

};

#endif
В вашем случае будет WQueue<std::string>
ava
chetl | 28.10.2016, 14:52 #
можете выдрать из вашего кода что нужно мне?
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
  xvr   chetl
advanced
Absenden