TensorFlow:添加新Op时类成员的线程安全性

时间:2017-01-02 19:42:29

标签: thread-safety tensorflow

我很困惑在编写新操作时何时需要考虑线程安全问题。

在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 _"的变量。来自数据竞赛?如果是,您能告诉我相应代码的位置,以确保该变量的线程安全吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

请注意,文档说明" Compute"方法必须是线程安全的。如果在OpKernel的Compute函数中,变量被修改,则需要互斥锁,因为多个线程可以在同一个OpKernel对象上调用Compute()。

在此示例中,preserve_index_是在构造OpKernel期间设置的成员变量,而不是Compute方法。只能从一个线程(创建该唯一对象的线程)访问对象的构造函数,因此不需要保护该变量。之后,该对象在Compute()中是只读的,因此不需要互斥锁。