我正在使用具有这样的线程向量的服务器:
vector<thread> thred;
每次客户端连接到服务器时,它都会在服务器中创建一个新线程,如下所示:
thred.push_back(thread(NewClient, ClientSocket, recvbuf, recvbuflen));
thred[thred.size()-1].detach();
其中NewClient是一个带有ClientSocket,recvbuf和recvbuflen参数的函数。所以我的问题是,如果有任何方法或函数我可以在NewClient中使用来关闭线程并擦除函数本身正在使用的向量元素。
任何帮助将不胜感激。
答案 0 :(得分:0)
可能使用map<int,thread>
而不是vector
来存储您的线程,并将线程的map键作为附加参数传递给线程方法。当线程完成执行时,它可以从主表中删除它。
map键可以是一个简单的东西,就像一个不断递增的整数值。
不要像斯蒂芬所说的那样忘记用互斥或类似的东西包裹桌子。答案 1 :(得分:0)
也许创建另一个向量
vector<int> thread_exit_time;
并将其设置为线程函数NewClient
退出时的系统时间。您可以检查thred.push_back
并替换那些死线程,而不是调用thread_exit_time
。
由于你调用detach
,没有其他方法可以检查线程是否存在。
创建pair
vector<std::pair<thread,int>> thread;
确保两个向量同步。
无论如何,您应首先考虑为什么需要保留分离的线程列表,如@SergeyA所述。