如果不另行说明,可以假设get方法是线程安全的吗?

时间:2012-07-25 10:38:23

标签: c++ thread-safety getmethod

如果在方法文档中没有另外说明,那么通常可以假设get方法的线程安全吗?或者反过来说如果没有另外说明的话,永远不应该假设线程安全?你觉得怎么样?

修改

假设一个班级

class InfoClass {
  public:
    void Init();
    int  GetInfo();
    void Free();
};

在线程上下文中调用Init()一次,GetInfo(),在线程操作结束后调用Free()

4 个答案:

答案 0 :(得分:4)

如果没有另外说明,我认为您应该假设该方法为not thread-safe

实际上,我认为没有理由假设某个方法默认为thread-safe

答案 1 :(得分:4)

线程安全总是需要额外的工作,所以你唯一可以安全地假设是相反的 - 在没有直接支持的情况下,线程安全支撑。

说明:

假设您有一个get ter用于简单的64位long long并且运行在32位架构上。虽然计算机正在获取该长64位值的后半部分(刚刚完成了上半部分),但另一个线程更新了下半部分,现在你所拥有的是不一致 - 因此它不是线程安全的。

修改(以匹配问题中的修改):

(旁注 - 你提出课程的方式使其无法使用,因为所有成员都是私人的)

如果您没有任何访问方法在构建类之后更改类的状态,那么可以假设线程安全。但是它仍然是一个草率的斜率,因为后来对于不了解你的假设的人可能会在课堂上添加一个set并且在随机错误调试体验中有一个美妙的旅程;)

答案 2 :(得分:2)

get方法可以是线程安全的,但不一定是。如果有一个班级:

class A {
    int value;

    int getValue() {
        return value;
    }

    void processValue() {
        value += 2;
        value = value*2;
    }
}

在上面的代码中,getValue显然不是线程安全的,因为当另一个线程位于processValue的第二行时可能会被调用,因此变量value位于不一致的状态。所以,这里的getter是重入的(再次,这可能不是这样),但仍然不是线程安全的。

正如其他人在此主题中提到的那样,除非另有说明,否则假设它不是线程安全的。

答案 3 :(得分:0)

如果在调用set方法时使用get方法更新变量,结果将是垃圾。因此,除非另有说明,否则不能假设线程安全。