Форум программистов, компьютерный форум CyberForum.ru

Как десятью потоками выполнить операцию 50 раз - C++

Восстановить пароль Регистрация
 
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
24.11.2014, 00:29     Как десятью потоками выполнить операцию 50 раз #1
Есть массив потоков в количестве 10 штук и есть функция, которая должна выполниться 50 раз, как 10 потоками выполнить её 50 раз?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
24.11.2014, 05:13     Как десятью потоками выполнить операцию 50 раз #2
в каждом потоке вызывай функцию по 5 раз
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
24.11.2014, 14:45  [ТС]     Как десятью потоками выполнить операцию 50 раз #3
Цитата Сообщение от demmax2004 Посмотреть сообщение
в каждом потоке вызывай функцию по 5 раз
Как это выполнить, если обращение следующего типа:
C++
1
std::thread cook = std::thread(&Cannibals::Cooking, &c);
Cannibals - класс, Cooking - его метод, с - объявление класса (Cannibals)
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
24.11.2014, 15:12     Как десятью потоками выполнить операцию 50 раз #4
Вот в функции потока Cooking и вызывай функцию 5 раз
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
24.11.2014, 15:17  [ТС]     Как десятью потоками выполнить операцию 50 раз #5
Цитата Сообщение от demmax2004 Посмотреть сообщение
Вот в функции потока Cooking и вызывай функцию 5 раз
Это рекурсия, но нужна динамика, если потоков будет 30, а функцию понадобится вызвать 130 раз, то как?
Необходим динамический цикл, с количеством итераций равным количеству вызовов и в нём организовать доступ потоков, но как это сделать?

На моём примере 30 потоков будут задействованы полностью 4 раза, то есть 120 итераций, а на 5-й будет задействовано только 10 из 30 и на этом цикл прерывается...
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
24.11.2014, 15:27     Как десятью потоками выполнить операцию 50 раз #6
Цитата Сообщение от Satansoft Посмотреть сообщение
Это рекурсия,
Откуда там рекурсия ??? там цикл в котором твоя функция будет вызываться 5 раз

В цикле соответственно будет атомарно инкрементироваться глобальная переменная для всех потоков и проверяться, на количество вызовов твоих функций
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
24.11.2014, 15:32  [ТС]     Как десятью потоками выполнить операцию 50 раз #7
Цитата Сообщение от demmax2004 Посмотреть сообщение
Откуда там рекурсия ??? там цикл в котором твоя функция будет вызываться 5 раз
Такоэ?
C++
1
2
3
4
5
6
int Dinner(int z)
{
int z;
for(int k;k<z;k++){
Dinner(int z);}
}
z - к-во итераций, передаваемое вызовом
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
24.11.2014, 15:35     Как десятью потоками выполнить операцию 50 раз #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
int Dinner(int z)
{
int k = 0;
for(int k;k<z;k++){
MyFunc(....MyParam.....);}
}
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 698
24.11.2014, 15:38  [ТС]     Как десятью потоками выполнить операцию 50 раз #9
demmax2004, вызывать функцию, которая будет вызывать функцию в цикле? Чем хуже рекурсивный метод?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
24.11.2014, 15:40     Как десятью потоками выполнить операцию 50 раз #10
Когда что подобное делал. Вот, может подойдет мой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <thread>
#include <future>
#include <vector>
#include <chrono>
#include <random>
#include <cmath>
#include <mutex>
#include <functional>
#include <algorithm>
 
std::mutex mut;
 
void foo(std::mt19937 & mt) {
   std::uniform_int_distribution<> dist{1, 10};
   std::this_thread::sleep_for(std::chrono::seconds(dist(mt)));
   std::lock_guard<std::mutex> locker{mut};
   std::cout << "foo() from thread ID: " << std::this_thread::get_id() << "\n";
}
 
int main()
{
   std::mt19937 gen{static_cast<unsigned>(std::time(nullptr))};
 
   using fiture_t = std::future<void>;
   std::vector<fiture_t> futures(10);
 
   std::cout << std::unitbuf;
   for (fiture_t& f : futures)
   {
      f = std::async(std::launch::async, foo, std::ref(gen));
   }
 
   int numberOfTask = 40;
   while (numberOfTask > 0)
   {
      auto ready = std::find_if(futures.begin(), futures.end(), [](fiture_t& fut)
      {
         return fut.wait_for(std::chrono::milliseconds(10)) == std::future_status::ready;
      });
 
      if (ready == futures.end()) continue;
 
      else
      {
         ready->get();
         *ready = std::async(std::launch::async, foo, std::ref(gen));
         --numberOfTask;
      }
   }
   std::this_thread::sleep_for(std::chrono::seconds(12));
 
   system("pause");
   return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2014, 15:43     Как десятью потоками выполнить операцию 50 раз
Еще ссылки по теме:

Числа по основанию 2 и 16. Выполнить операцию умножения C++
Ввести два числа и выполнить указанную операцию C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
24.11.2014, 15:43     Как десятью потоками выполнить операцию 50 раз #11
Dinner() это твой поток
Yandex
Объявления
24.11.2014, 15:43     Как десятью потоками выполнить операцию 50 раз
Ответ Создать тему
Опции темы

Текущее время: 01:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru