线程调用的函数对删除对象安全吗?

时间:2018-10-03 09:50:01

标签: c++ multithreading thread-safety

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

示例:

datatype ('a, 'b) either = Left of 'a | Right of 'b
fun nth (xs, n) =
    let fun go ([], _) = Left n
          | go (x::_, 0) = Right x
          | go (_::ys, i) = ...
    in if n < 0 then Left n else go (xs, n)
    end

val example_1 = nth ([2,3,5], 5)  (* gives: Left 5  *)
val example_2 = nth ([2,3,5], ~1) (* gives: Left ~1 *)
val example_3 = nth ([2,3,5], 2)  (* gives: Right 5 *)

问题:在上述情况下,A-> functionA调用函数functionA。如果函数正在执行,自对象A调用后删除A对函数执行有什么影响? functionA无法处理共享数据吗?

1 个答案:

答案 0 :(得分:2)

  

如果函数正在执行,自对象A调用后删除A对函数执行有什么影响?

如果执行函数以任何方式使用this,则影响将是不确定的行为。通过使用this是指访问任何数据成员或基础子对象,调用任何成员函数,间接访问this或将this传递给将执行任何上述操作的某个函数。

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

但是,这样做不是一个好主意,因为在functionA的定义中看不到没有成员可以访问。对于程序员来说,在以后更改功能时很容易不遵循该要求。

据我所知,这种情况类似于delete this;的情况,该情况被认为符合标准,但可能存在危险:Is delete this allowed?