C++ C++;线程在其末尾删除自身

C++ C++;线程在其末尾删除自身,c++,multithreading,C++,Multithreading,我正在编写一个允许同时从多个客户端连接的服务器。我为每个新连接创建一个新线程。客户端使用此线程与服务器通信。当客户端与服务器断开连接时,我需要将线程的内存取消分配到服务器进程中 问题是当我尝试“删除线程本身”时 我写了一些代码来解释我的问题。C类表示一个新的连接。我为每个连接动态创建这个类的一个新对象。自动简化功能动作以解释问题 #include <thread> #include <iostream> #include <mutex> #include &l

我正在编写一个允许同时从多个客户端连接的服务器。我为每个新连接创建一个新线程。客户端使用此线程与服务器通信。当客户端与服务器断开连接时,我需要将线程的内存取消分配到服务器进程中

问题是当我尝试“删除线程本身”时

我写了一些代码来解释我的问题。C类表示一个新的连接。我为每个连接动态创建这个类的一个新对象。自动简化功能动作以解释问题

#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:当然你不想泄漏内存,但你也不应该让内存自行清理。你的主线程应该管理它的工作线程,包括它们的清理。我更改了设计。现在我将内存清理到主线程中。下面是一个示例: