Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать ограниченное число потоков в цикле 
:(
    Опции темы
gonan
Дата 17.4.2017, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.7.2011

Репутация: нет
Всего: нет



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

Код

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


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

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

Это сообщение отредактировал(а) gonan - 17.4.2017, 14:54
PM MAIL   Вверх
xvr
Дата 17.4.2017, 15:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Семафор вам в помощь - https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%...B8%D0%BA%D0%B0)


PM MAIL   Вверх
gonan
Дата 17.4.2017, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.7.2011

Репутация: нет
Всего: нет



С семафором понял.
Код

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

А как подождать после цикла, пока все потоки не выполнятся?
PM MAIL   Вверх
rudolfninja
Дата 17.4.2017, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



WaitForMultipleObjects вам в помощь
Ну это если вы пишите под Windows.

Это сообщение отредактировал(а) rudolfninja - 17.4.2017, 15:52
PM MAIL Skype   Вверх
xvr
Дата 17.4.2017, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



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

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

PM MAIL   Вверх
gonan
Дата 17.4.2017, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.7.2011

Репутация: нет
Всего: нет



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

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

Честно говоря, не уловил Ваших рассуждений. ?????
PM MAIL   Вверх
xvr
Дата 18.4.2017, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Код

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(); нужно перенести в конец запускаемого потока

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1366 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.