Я не понимаю этого: завершение вызывается после создания экземпляра ‘std :: length_error’

#c #multithreading

#c #многопоточность

Вопрос:

Прежде всего, я не англичанин, поэтому я постараюсь объяснить как можно лучше. Я создаю этот поток, где saludo означает приветствие, retardo означает задержку, numero означает число, я также создаю veces для повторения много раз, что это произойдет. Итак, что мне нужно сделать, это создать 10 потоков, которые будут отображаться на экране от 5 до 15 раз и с задержкой от 100 до 300, что они являются числом («Соевое» число), но у меня есть эта ошибка, которую я вообще не могу решить. Он работает для 2-3 потоков, а затем останавливается. Спасибо, кстати.

 #include <iostream>
#include <thread>
#include <string>
#include <chrono>
#include <time.h>

using namespace std;

void saludo(string m, int retardo, int numero) {
    string tabs(numero - 1, 't');
    cout << tabs << m << numero <<  "n";
    this_thread::sleep_for(chrono::milliseconds(retardo));
}

int main() {
    int nthread = 10;
    srand(time(NULL));
    thread P[nthread];
    int i = 0;

    while(i<nthread){
        int retardo = rand() % 201   100;
        int veces = rand() % 11   5;

        for (int x = 0; x<veces;   x){
            int numero = rand() % 10;
            P[i] = thread(amp;saludo, "Soy  ", retardo, numero);
            P[i].join();
        }
    }

    cout << "Finn"; 
    return 0;
}
 

Ответ №1:

Эта ошибка связана с тем, что вы, возможно, передали отрицательное число в конструктор std::string. rand() % 10 может дать 0. И вы делаете string tabs(numero - 1, 't'); это, что является проблемой, если numero равно 0.