我很困惑在编写新操作时何时需要考虑线程安全问题。
在TensorFlow的How-to add a new op guide,中,我读了下面的句子,提醒用户添加互斥锁以防止数据竞争。
重要提示:可以同时访问OpKernel的实例。您的Compute方法必须是线程安全的。保护任何 使用互斥锁访问类成员(或者更好的是,不要共享状态 通过班级成员!考虑使用ResourceMgr来跟踪Op 状态)。
但是,在同一网页中关于how to add attr to op,的后续文字中,我发现类成员int preserve_index_;
在给定的代码段中不受互斥锁保护:
class ZeroOutOp : public OpKernel {
public:
explicit ZeroOutOp(OpKernelConstruction* context) : OpKernel(context) {
// Get the index of the value to preserve
OP_REQUIRES_OK(context,
context->GetAttr("preserve_index", &preserve_index_));
// Check that preserve_index is positive
OP_REQUIRES(context, preserve_index_ >= 0,
errors::InvalidArgument("Need preserve_index >= 0, got ",
preserve_index_));
}
void Compute(OpKernelContext* context) override {
// ...
}
private:
int preserve_index_;
};
那么,TensorFlow中是否有任何隐式机制来保护名为" preserve_index _"的变量。来自数据竞赛?如果是,您能告诉我相应代码的位置,以确保该变量的线程安全吗?
提前致谢!
答案 0 :(得分:1)
请注意,文档说明" Compute"方法必须是线程安全的。如果在OpKernel的Compute函数中,变量被修改,则需要互斥锁,因为多个线程可以在同一个OpKernel对象上调用Compute()。
在此示例中,preserve_index_是在构造OpKernel期间设置的成员变量,而不是Compute方法。只能从一个线程(创建该唯一对象的线程)访问对象的构造函数,因此不需要保护该变量。之后,该对象在Compute()中是只读的,因此不需要互斥锁。