【问题标题】:C++ MultiThreading: What happens if destructor and member function are running in separate threadsC ++多线程:如果析构函数和成员函数在不同的线程中运行会发生什么
【发布时间】:2016-01-09 03:52:19
【问题描述】:

我有一个类对象,它的函数可以从不同的线程中调用。

可能会遇到 Thread1(T1) 调用析构函数的情况,
而 Thread(T2) 正在同一个对象上执行一些其他功能。

假设 T1 能够首先调用析构函数,那么 T2 中运行的代码会发生什么?
它会产生崩溃还是由于对象已经被销毁,成员函数将停止运行?

是否会在所有类函数的入口处使用互斥锁并在退出时解锁,以确保在析构函数和成员函数之间发生的任何类型的竞争中都不会崩溃?

感谢您的帮助!

【问题讨论】:

  • 未定义的行为,参见。 Running method while destroying the object
  • '可能会遇到 Thread1(T1) 正在调用析构函数,而 Thread(T2) 正在同一对象上执行某些其他函数的情况。 - 好吧,改变你的设计,让它不会发生。做坏事,坏事就会接踵而至。

标签: c++ linux multithreading c++11


【解决方案1】:

没有。因为逻辑有问题。如果 T1 完全有可能调用析构函数,则互斥体不会阻止它继续尝试这样做。

T1 和 T2 之间存在共享数据,因此您必须确保两者都不会尝试调用不存在的共享对象上的方法。

单独的互斥锁无济于事。

【讨论】:

    【解决方案2】:

    你会得到什么是未知和不可预测的。您正在描述一个经典的多线程错误/糟糕的设计。

    实例在使用前应正确锁定,包括销毁。一旦你这样做了,就不可能在另一个线程中被销毁的实例上调用成员函数。

    锁定 inside 函数将无济于事,因为如果 2 个单独的线程持有对同一实例的引用,其中 1 个导致它被破坏,另一个线程持有错误的引用并且不会不知道。一个典型的解决方案是使用 refcounts,一旦不存在对它的引用,销毁由对象本身负责。在 C++ 中,您通常会使用 shared_ptr<> 来执行此操作。

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 2012-05-10
      相关资源
      最近更新 更多