Как распределять задачу между заданным пользователем количеством потоков
Программа получает от пользователя количество потоков, между которыми необходимо распределить задачу. Допустим мне надо экспериментально найти шансы победы игроков. Я хочу чтобы каждый поток выполнял один эксперимент, как можно такое реализовать? Я пробовал следующее:
#include <iostream>
#include <thread>
using namespace std;
void dice_roll_person1(int& sum, int K){
for (int i = 0; i < K; ++i) {
cout << "ID потока = " << this_thread::get_id() << endl;
sum = sum + (rand() % 12 + 1);
}
}
void dice_roll_person2(int& sum, int K){
for (int i = 0; i < K; ++i) {
cout << "ID потока = " << this_thread::get_id() << endl;
sum = sum + (rand() % 12 + 1);
}
}
int main(int argc, char *argv[]) {
if (argc != 2){
cout << "enter number of threads as a flag\n";
exit(1);
}
int threads_num = atoi(argv[1]);
cout << "Threads_num: " << threads_num << endl;
int K, tour, sum1, sum2, experiments;
double won1 = 0, won2 = 0;
cout << "Введите K, тур, суммарные очки игроков, количество экспериментов: ";
cin >> K >> tour >> sum1 >> sum2 >> experiments;
if(experiments <= threads_num) {
for (int i = 0; i < experiments; ++i) {
for(int j = 0; j < threads_num; ++j){
thread t(dice_roll_person1, ref(sum1), K);
thread t2(dice_roll_person2, ref(sum2), K);
t.join();
t2.join();
}
cout << "Player1: " << sum1 << "\tPlayer2: " << sum2 << endl;
if (sum1 > sum2) ++won1;
else if (sum1 < sum2) ++won2;
}
}
cout << "Player1 chances: " << won1 / experiments * 100 << "%" << endl;
cout << "Player2 chances: " << won2 / experiments * 100 << "%" << endl;
return 0;
}
Но создается лишь 2 потока, а не заданное пользователем количество.
Ответы (2 шт):
Вообще-то вот этот код
thread t(dice_roll_person1, ref(sum1), K);
thread t2(dice_roll_person2, ref(sum2), K);
t.join();
t2.join();
это — создать два потока t и t2, дождаться, пока закончится первый, дождаться, пока закончится второй. Только после этого двигаться дальше.
Общий подход к созданию N потоков:
std::vector<std::thread> threads;
for (size_t i = 0; i < N; ++i)
{
threads.push_back(std::thread(/*Ваши аргументы для конструктора потока*/));
}
Потом из полученного вектора можно по индексу получать нужный поток и работать с ним.
Насчёт конкретно Вашей задачи: логика не вполне ясна. Если опишете подробнее, в чём суть программы, попробую дать более приближенное решение.