C++ C++;线程在其末尾删除自身
我正在编写一个允许同时从多个客户端连接的服务器。我为每个新连接创建一个新线程。客户端使用此线程与服务器通信。当客户端与服务器断开连接时,我需要将线程的内存取消分配到服务器进程中 问题是当我尝试“删除线程本身”时 我写了一些代码来解释我的问题。C类表示一个新的连接。我为每个连接动态创建这个类的一个新对象。自动简化功能动作以解释问题C++ C++;线程在其末尾删除自身,c++,multithreading,C++,Multithreading,我正在编写一个允许同时从多个客户端连接的服务器。我为每个新连接创建一个新线程。客户端使用此线程与服务器通信。当客户端与服务器断开连接时,我需要将线程的内存取消分配到服务器进程中 问题是当我尝试“删除线程本身”时 我写了一些代码来解释我的问题。C类表示一个新的连接。我为每个连接动态创建这个类的一个新对象。自动简化功能动作以解释问题 #include <thread> #include <iostream> #include <mutex> #include &l
#include <thread>
#include <iostream>
#include <mutex>
#include <chrono>
using namespace std;
mutex m;
class C {
thread *t;
static void action(int n, C* obj) {
for (int i = 0; i < 10; i++) {
m.lock();
cout << "i:" << i << ", n:" << n << endl;
m.unlock();
}
delete(obj);
}
public:
C() : t(nullptr) {}
~C() {
delete(t); // Work if I comment this line
}
void launch() {
static int i = 0;
t = new thread(action, i++, this);
}
};
int main() {
C *c1 = new C();
c1->launch();
this_thread::sleep_for(chrono::seconds(5));
return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
互斥m;
C类{
螺纹*t;
静态空洞作用(int n,C*obj){
对于(int i=0;i<10;i++){
m、 锁();
cout在销毁std::thread
之前,必须使用t->join()
将其“连接”起来
参考:
如果*此
具有关联的线程(joinable()==true
),则调用std::terminate()
但是,更致命的是,您试图从线程本身内部执行所有这些操作。您不能这样做:
例外情况
std::系统错误
如果发生错误
错误条件
resource\u死锁\u将发生
如果this->get\u id()==std::this\u thread::get\u id()
(检测到死锁)
顺便说一句,您应该会丢失该动态分配。您不需要它。在可连接的线程上调用析构函数被指定为程序的终止。它必须是连接的
或分离的
此外,您还应该使用这些RAII帮助程序,以及互斥锁的锁定保护,就好像发生异常时您不会正确释放锁一样
作为一个旁注:使用每个连接的一个线程不是最好的资源使用,除非你希望有少量的同时连接。
你为什么使用指针?你可以用不需要清理的自动对象来完成这一切。@ LexNeasraceSin轨道,这是C++,不是C,叹息。OLLION:不需要<代码>在演示代码中使用W/CODE或指针。使用名称空间STD避免<>代码;, STD 中有太多的符号。考虑使用线程池而不是为每个新连接创建新线程。我不知道足够的C++来知道是否有一个好的线程池实现,您可以只使用它,但这是一个简单的想法:您有一个任务阻塞队列(在本例中,每个任务都是一个表示正在等待服务的客户机的对象),并且您有一些线程一直循环试图从队列中获取任务。当线程获得任务时,它执行任务(即,它为客户机服务),然后它没有死掉,而是返回等待下一个任务。如果我在删除线程之前尝试加入线程,程序会抛出异常“std::system\u error”@奥利弗007:仔细看了一下操作
。看起来你在试图从线程本身删除线程。为什么?你遇到了资源死锁\u会发生
错误情况。我认为你应该重新审视你的设计!我正在尝试这么做。我从线程本身删除线程,因为如果我不这样做,内存泄漏和y服务器使用太多内存。@olive007:当然你不想泄漏内存,但你也不应该让内存自行清理。你的主线程应该管理它的工作线程,包括它们的清理。我更改了设计。现在我将内存清理到主线程中。下面是一个示例: