Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Создать ограниченное число потоков в цикле


Автор: gonan 17.4.2017, 14:52
Необходимо реализовать следующий код:
Есть функция например foo, которую необходимо запускать как отдельный поток в следующем коде:

Код

.......
for(i=0; i<400; i++)
{
  .......
  Создать поток foo(i);
  ......
}
........


Так же необходимо учитывать, что потоков не может быть например больше 3 одновременно выполняющихся.
После выхода из цикла необходимо дождаться пока все потоки завершаться.

Проблема как раз с ограничением. Как реализовать.

Автор: xvr 17.4.2017, 15:05
Семафор вам в помощь - https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D0%BC%D0%B0%D1%84%D0%BE%D1%80_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)


Автор: gonan 17.4.2017, 15:23
С семафором понял.
Код

.......
semaphore.init(3);
for(i=0; i<400; i++)
{
  .........    
  semaphore.enter();
  Создать поток foo(i);
  semaphore.leave();
  ........
}
........

А как подождать после цикла, пока все потоки не выполнятся?

Автор: rudolfninja 17.4.2017, 15:49
https://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx вам в помощь
Ну это если вы пишите под Windows.

Автор: xvr 17.4.2017, 17:32
Цитата(gonan @  17.4.2017,  15:23 Найти цитируемый пост)
А как подождать после цикла, пока все потоки не выполнятся? 

Про WaitForMultiple... вам уже посоветовали, а если оставаться в рамках того, что уже есть, то достаточно захватить семафор после цикла еще 3 раза (ну или сколько там у вас параллельных потоков предусмотрено)

Автор: gonan 17.4.2017, 18:44
Цитата(xvr @ 17.4.2017,  17:32)
Цитата(gonan @  17.4.2017,  15:23 Найти цитируемый пост)
А как подождать после цикла, пока все потоки не выполнятся? 

Про WaitForMultiple... вам уже посоветовали, а если оставаться в рамках того, что уже есть, то достаточно захватить семафор после цикла еще 3 раза (ну или сколько там у вас параллельных потоков предусмотрено)

Честно говоря, не уловил Ваших рассуждений. ?????

Автор: xvr 18.4.2017, 13:39
Код

semaphore.init(3);
for(i=0; i<400; i++)
{
  .........    
  semaphore.enter();
  Создать поток foo(i);
  // semaphore.leave(); <-- move it to 'foo' body
  ........
}
for(i=0;i<3;++i)
{
  semaphore.enter();
}

По выходу семафор будет захвачен 3 раза, а это значит, что будет можно запустить 3 потока (т.к. потоки реально не запускаются). Так как семафор настроен на 3 потока максимум, это значит, что все предыдущие потоки завершились

PS. semaphore.leave(); нужно перенести в конец запускаемого потока

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)