首页 > 解决方案 > 线程调用的函数对对象删除安全吗?

问题描述

我想知道thread1是否通过传递的对象'obj->fun()'调用类函数,并且该对象在后台被其他线程删除,例如thread2线程1执行函数时会发生什么。

例子:

ClassA {
  int functionA() {
    ...condition(started_execution);
    int a=0;
    a++;
    printf(....a);
    return a;
  }
};
void startExecution(void *arg) {
/*casting code object A*/
  A->functionA();
}

int main() {
  ClassA *A = new ClassA();
  pthread_create(....,startExecution,(void *)A);
  ....wait_for(started_execution);
    delete A;//just want to know the behaviour and not join method.
}

问题:在上述场景中,A->functionA 调用函数functionA。如果函数正在执行,那么自对象A调用以来,delete A对函数执行有何影响?functionA 不处理共享数据?

标签: c++multithreadingthread-safety

解决方案


如果函数正在执行,那么自对象A调用以来,delete A对函数执行有何影响?

如果执行函数this以任何方式使用,影响将是未定义的行为。使用this我的意思是访问任何数据成员或基本子对象,调用任何成员函数,间接this或传递this给可以执行任何这些操作的某个函数。

设置条件变量后,您functionA似乎没有以this任何方式使用,因此不会产生任何影响 - 假设条件变量访问本身已正确同步。

但是,这样做并不是一个好主意,因为在functionA不得访问任何成员的定义中是不可见的。程序员在以后更改函数时很容易不遵循该要求。

据我所知,这种情况类似于delete this;被认为符合标准但有潜在危险的情况:是否允许删除?


推荐阅读