Хорошо, ваш код не имеет смысла, но многопоточность может сбивать с толку при первом запуске.
Вы делаете это:
case 3:
{
int id;
cout << "ID to be monitored" << endl;;
cin >> id;
thread the1(thred1, id);
the1.join();
break;
}
Что этот код собираетВаш идентификатор, создайте цепочку и дождитесь ее завершения. Может быть, это то, что вы хотите, но я не понимаю, почему вы должны создать поток, а затем сразу же иметь блок основного потока, пока не закончится первый поток.
Но это то, что делает the1.join () - этоблокирует основной поток выполнения до завершения рабочего потока. Это то, что вы хотите?
Далее, ваш рабочий поток довольно прост. Он ищет ваш вектор, останавливаясь на 1 секунду для каждого цикла. Это НЕ делает какой-либо работы навсегда. Он просто проходит через ваш вектор, ища значение, которое вы передали. Это то, что вы хотите?
Не вдаваясь в блокировку мьютекса и условные переменные (которые вы должны будете изучить, если собираетесь писать многопоточное программирование), я бы немного изменил это.
Сохранение вашего кода в основном нетронутым ...
В главном потоке я объявил бы переменную.
thread * myThread = nullptr;
Я также объявил бы глобальную переменную с именем stopThread:
bool stopThread = false;
Для случая 3 я бы переписал его как:
case 3: {int id;cout << "ID для мониторинга" << endl ;;cin >> id;// Это убивает старый поток в случае, если они делают вариант 3 дважды. if (myThread! = nullptr) {stopThread = true;myThread-> Join ();удалить myThread;} stopThread = false;myThread = новая тема (thred1, id);сломать;}
Для случая 4:
case 4:
if (myThread != nullptr) {
stopThread = true;
myThread.join();
delete myThread;
myThread = nullptr;
cout << "monitoring stopped" << endl;
}
break;
Тогда вы в своем методе потока:
void thred1(int id) {
while (!stopThread) {
bool err = false;
for (size_t i = 0; !stopThread && i < v.size(); i++) {
if (id == v[i] - > id) {
c. out << "element found " << v[i] - > id << " -- " << v[i] - > name << endl;
v[i] - > Read();
this_thread::sleep_for(chrono::seconds(2));
err = true;
break;
}
}
}
}
Теперь вот что я сделал ... Сначала я настроилтак что ваша тема длится, что я думаю, что вы хотите. Я дал вам средство сообщить потоку об остановке (переменная stopThread). И ваш поток теперь зацикливается, пока вы не скажете ему выйти.
Это не точно , как я бы написал, но это близко к тому, что я сделал бы, внося минимальные изменения в вашкод.