2017-01-02 3 views
1

Ich bin verwirrt darüber, wenn es notwendig ist, das Problem der Threadsicherheit beim Schreiben eines neuen Op zu berücksichtigen.TensorFlow: Threadsicherheit des Klassenmitglieds beim Hinzufügen eines neuen Op

In TensorFlow How-to add a new op guide, lese ich unten Satz, der die Benutzer daran erinnert, einen Mutex hinzuzufügen, um Datenrennen zu verhindern.

Wichtiger Hinweis: Auf Instanzen Ihres OpKernel kann gleichzeitig zugegriffen werden. Ihre Compute-Methode muss Thread-sicher sein. Schütze alle Zugriff auf Klassenmitglieder mit einem Mutex (Oder noch besser, nicht teilen über Klassenmitglieder! Erwägen Sie mit einem ResourceMgr zu verfolgen Op Zustand).

jedoch im gefolgt Text in der Web-Seite über how to add attr to op, ich die Klasse Mitglied gefunden int preserve_index_; nicht durch Mutex im gegebenen Code-Schnipsel geschützt:

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_; 
}; 

So ist es ein impliziter Mechanismus in TensorFlow, um die Variable "preserve_index_" vor Datenrennen zu schützen? Wenn ja, könnten Sie mir bitte die Position der entsprechenden Codes mitteilen, die die Thread-Sicherheit dieser Variable gewährleistet?

Vielen Dank im Voraus!

Antwort

1

Beachten Sie, dass die Dokumentation besagt, dass die "Compute" -Methode Thread-sicher sein muss. Ein Mutex wäre erforderlich, wenn die Variable in der Compute-Funktion des OpKernel geändert würde, da mehrere Threads Compute() für dasselbe OpKernel-Objekt aufrufen können.

In diesem Beispiel ist preserve_index_ eine Membervariable, die während der Konstruktion des OpKernel und nicht der Compute-Methode festgelegt wird. Auf den Konstruktor eines Objekts wird nur von einem Thread (dem Thread, der dieses eindeutige Objekt erstellt) zugegriffen, so dass diese Variable nicht geschützt werden muss. Das Objekt wird anschließend in Compute() schreibgeschützt, sodass kein Mutex benötigt wird.

+0

notiert! Vielen Dank! :) –

Verwandte Themen