Как распределять задачу между заданным пользователем количеством потоков

Программа получает от пользователя количество потоков, между которыми необходимо распределить задачу. Допустим мне надо экспериментально найти шансы победы игроков. Я хочу чтобы каждый поток выполнял один эксперимент, как можно такое реализовать? Я пробовал следующее:

#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 шт):

Автор решения: Harry

Вообще-то вот этот код

thread t(dice_roll_person1, ref(sum1), K);
thread t2(dice_roll_person2, ref(sum2), K);
t.join();
t2.join();

это — создать два потока t и t2, дождаться, пока закончится первый, дождаться, пока закончится второй. Только после этого двигаться дальше.

→ Ссылка
Автор решения: V-Mor

Общий подход к созданию N потоков:

std::vector<std::thread> threads;
for (size_t i = 0; i < N; ++i)
{
    threads.push_back(std::thread(/*Ваши аргументы для конструктора потока*/));
}

Потом из полученного вектора можно по индексу получать нужный поток и работать с ним.

Насчёт конкретно Вашей задачи: логика не вполне ясна. Если опишете подробнее, в чём суть программы, попробую дать более приближенное решение.

→ Ссылка