如果在方法文档中没有另外说明,那么通常可以假设get方法的线程安全吗?或者反过来说如果没有另外说明的话,永远不应该假设线程安全?你觉得怎么样?
修改:
假设一个班级
class InfoClass {
public:
void Init();
int GetInfo();
void Free();
};
在线程上下文中调用Init()
一次,GetInfo()
,在线程操作结束后调用Free()
。
答案 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
方法更新变量,结果将是垃圾。因此,除非另有说明,否则不能假设线程安全。