擦除它创建的函数中的线程

Erasing a thread inside the function it makes

本文关键字:线程 函数 擦除 创建      更新时间:2023-10-16

我正在处理一个具有如下线程向量的服务器:

vector<thread> thred;

每次客户端连接到服务器时,它都会在服务器中创建一个新线程,如下所示:

thred.push_back(thread(NewClient, ClientSocket, recvbuf, recvbuflen));
thred[thred.size()-1].detach();

其中 NewClient 是一个带有参数 ClientSocket、recvbuf 和 recvbuflen 的函数。所以我的问题是,我是否可以在 NewClient 中使用任何方法或函数来关闭线程并擦除功能本身正在使用的向量元素。

任何帮助将不胜感激。

也许创建另一个向量

vector<int> thread_exit_time;

并将其设置为线程函数NewClient退出的系统时间。无需调用thred.push_back您可以检查thread_exit_time并替换这些死线程。

由于您调用detach因此没有其他方法可以检查线程是否处于活动状态。

最好创建一个pair向量

vector<std::pair<thread,int>> thread;

以确保两个向量同步。

无论如何,您应该首先考虑为什么需要保留@SergeyA提到的分离线程列表。

也许使用 map<int,thread> 而不是 vector 来存储线程,并将线程的映射键作为附加参数传递给线程方法。 线程执行完毕后,它可以将自身从主表中删除。

映射键可以是简单的东西,例如不断递增的整数值。

不要忘记用互斥锁或类似的东西包裹桌子,正如斯蒂芬所说。