c++ - 线程调用的函数对对象删除安全吗?
问题描述
我想知道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 不处理共享数据?
解决方案
如果函数正在执行,那么自对象A调用以来,delete A对函数执行有何影响?
如果执行函数this
以任何方式使用,影响将是未定义的行为。使用this
我的意思是访问任何数据成员或基本子对象,调用任何成员函数,间接this
或传递this
给可以执行任何这些操作的某个函数。
设置条件变量后,您functionA
似乎没有以this
任何方式使用,因此不会产生任何影响 - 假设条件变量访问本身已正确同步。
但是,这样做并不是一个好主意,因为在functionA
不得访问任何成员的定义中是不可见的。程序员在以后更改函数时很容易不遵循该要求。
据我所知,这种情况类似于delete this;
被认为符合标准但有潜在危险的情况:是否允许删除?
推荐阅读
- python - 如何在我的代码中查找并修复附近的“(”:语法错误
- flutter - Agora 云端录制:错误 404(Flutter + Google Cloud Function)
- ssl - Apache2 有时提供旧的 SSL 证书
- node.js - 如何使用queryInterface在续集迁移文件中传递偏执狂,下划线等选项
- functional-programming - Idris 在类型定义中使用 if 语句返回依赖类型签名错误
- android - 如何在 Kotlin 中使用编程设置约束
- python - None 使用 asyncio 阻止“while True”
- python - Scrapy爬虫在第二次运行后不起作用
- javascript - 多次渲染?
- flutter - useScrollController 的安全使用?(颤振钩子)