Как остановить один поток из двух параллельных потоков? - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть программа, в которой мы можем контролировать 2 объекта одновременно.

myThread = new thread (thred1, id);
vec.push_back (myThread);

В функции thred1 я использую булеву функцию для чтения сохраненных значений из другого вектора, и она работает параллельно так: элемент найден 2 - hj
HUMIDITY-1681692777 ОТОБРАЖЕН В RH
найден элемент 1 - hj
ТЕМПЕРАТУРА - 1714636915 В ГРАДУСЕ Цельсия

Это продолжаетсяЗапуск, как это должно делать моя программа. У меня есть случай, когда мне нужно получить ID от пользователя и остановить этот конкретный поток, а другой должен продолжать работать, пока я не остановлю его. Может ли кто-нибудь помочь мне с этим?

void thred1 (int id) 
{
bool err = false;
    while (stopThread == false)
    {
    for (size_t i = 0; i < v.size (); i++)
        {
            if (id == v[i]->id)
                {
                cout << "element found " << v[i]->id << " -- " << v[i]->name << endl;
                v[i]->Read ();
                this_thread::sleep_for (chrono::seconds (4));
                err = true;
                break;
                }
        }

        if (!err)
        {
        cout << "element not found" << endl;
       break;
        }
    }
}

1 Ответ

0 голосов
/ 11 ноября 2019

Приостановка
1. Если вы хотите приостановить поток monitor , но только временно (т.е. внести какие-либо изменения), тогда вы можете просто использовать мьютекс. Заблокируйте его, прежде чем получить доступ к общему вектору, и разблокируйте его, когда вы закончите, гарантируя, что только один поток может одновременно получить доступ к данным.
2. Вы можете активно приостановить поток, используя поддержку ОС, такую ​​как SuspendThread и ResumeThread, в случае Windows, когда он будет готов.

Завершение
1. Вы можете использовать событие для каждого потока monitor , имя которого будет связано с идентификатором, будет работать. На каждой итерации монитора проверяйте событие завершения, завершая поток, если он активен.
2. Передайте некоторую переменную каждому потоку, сохраните их на карте, ключом которой является дескриптор потока, и аналогично предыдущему параметрупросто проверьте значение для каждой итерации.
3. Сохраните все потоки в карте с дескриптором в качестве ключа, завершив его напрямую с поддержкой ОС.

Честно говоря, существует множество способов сделать это, наилучшая реализация зависит от того, почему именно вы хотите остановить поток монитора. Любой объект синхронизации, такой как мьютекс, должен работать, если вы читаете из одного потока и пишете из другого. В противном случае достаточно просто сохранить все потоки с внутренним идентификатором в качестве ключа и значение потока в качестве значения для завершения потоков монитора по требованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...