如何从两个并行线程中停止一个线程?

我有一个程序,其中我们可以同时监视2个对象。

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

在thred1函数中,我使用布尔函数从另一个向量中读取存储的值,并且它并行运行,如下所示: 找到元素2-hj
HUMIDITY-1681692777在RH中显示
找到元素1-hj
TEMPERATURE--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;
        }
    }
}
dukx95 回答:如何从两个并行线程中停止一个线程?

暂停
1.假设您要暂停 monitor 线程,但只是暂时(即进行任何更改),则可以使用互斥锁。在访问共享矢量之前将其锁定,并在完成后将其解锁,以确保一次只有一个线程可以访问数据。
2.在Windows就绪的情况下,您可以使用SuspendThreadResumeThread等操作系统支持来主动挂起线程。

终止
1.您可以为每个 monitor 线程使用一个事件,链接到ID的名称将起作用。在监视器的每次迭代中,检查终止事件,如果线程处于活动状态,则结束线程。
2.将一些变量传递给每个线程,将它们存储在以线程句柄为键的映射中,并且与上一个选项类似,只需检查每次迭代的值即可。
3.将所有线程存储在以handle为键的映射中,并直接在OS支持下终止它。

老实说,有很多方法可以做到这一点,最好的实现取决于您到底为什么要停止监视线程。如果要从一个线程读取而从另一个线程写入,则任何类型的同步对象(例如互斥体)都应该很好。否则,只存储内部ID为键且线程为值的所有线程就可以按需终止监视线程。

本文链接:https://www.f2er.com/3126299.html

大家都在问