2017-01-02 36 views
1

我感到困惑的時候,有必要寫一個新的作品時要考慮線程安全的問題時。TensorFlow:類成員的線程安全添加新的運算

在TensorFlow的How-to add a new op guide,我閱讀下面的句子,提醒用戶添加一個互斥體,防止數據競爭。

重要注意事項:您的OpKernel的實例可以同時訪問。您的計算方法必須是線程安全的。保護任何 訪問具有互斥鎖的類成員(或者更好的是,不要通過類成員共享狀態 !考慮使用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

注意,文件說,「計算」的方法必須是線程安全的。將需要互斥如果在OpKernel的compute函數,變量正在修改,因爲多個線程可以在同一OpKernel對象調用計算()。

在這個例子中,preserve_index_是一個成員變量,它是在構建OpKernel時設置的,而不是Compute方法。對象的構造函數將只從一個線程(線程創建一個唯一的對象)來訪問,所以沒有必要保護該變量。該對象然後在Compute()中是隻讀的,因此不需要互斥鎖。

+0

注意!多謝! :) –

相關問題