2016-03-23 4 views
0
class ThreadGuard { 
public: 
    ThreadGuard(std::thread &t_): t(t_) {} 
    ~ThreadGuard() 
    { 
     if(t.joinable()) 
      t.join(); 
    } 
private: 
    std::thread &t; 
}; 

void func() 
{ 
    std::thread my_thread(f); 
    ThreadGuard thread_guard(my_thread); 
} 

Ich versuche, das ThreadGuard-Objekt zu verwenden, um zu garantieren, dass die Funktion nicht beendet wird, bis der Thread normal beendet wird. Was passiert aber, wenn kurz vor der Erstellung des thread_guard-Objekts eine Ausnahme auftritt?besteht die Möglichkeit, dass während der Variablendefinition eine Ausnahme auftritt?

+1

Es sollte in Ordnung sein. Wenn eine Ausnahme ausgelöst wurde, bedeutet dies, dass die Thread-Konstruktion fehlgeschlagen ist und der Thread nicht ausgeführt werden sollte. Die Funktion sollte beendet werden. Ist es richtig? – songyuanyao

+0

** - 1 ** Das 'if (t.joinable)' ist ** nicht der echte Code **. –

+0

Entschuldigung, ich habe einen Fehler gemacht. Es sollte 'if (t.joinable())' sein. – song

Antwort

0

Der Punkt von RAII ist, dass das Ressource erfassende Objekt die Ressource tatsächlich besitzt. Ihre ThreadGuard kann immer noch nicht garantieren, dass der Thread tatsächlich geschützt ist. Sie wollen etwas mehr wie:

class ThreadGuard { 
    std::thread t; 

public: 
    ~ThreadGuard() { 
     if (t.joinable()) t.join(); 
    } 

    // constructors and assignment as appropriate to actually 
    // initialize the thread object 
}; 

Auf diese Weise können Sie einfach schreiben:

ThreadGuard thread_guard(f); 

und sich keine Sorgen.

+0

Danke für Ihre Antwort. Aber ich verstehe nicht ganz, wie man einen geeigneten Konstruktor implementiert. Ich denke, der einzige richtige Weg, um das Mitglied 'std :: thread t 'zu initialisieren, erbt von der Klasse' std :: thread' und ruft seinen Konstruktor direkt im Konstruktor meiner eigenen Klasse auf. Wenn das der Fall ist, muss ich einen Parameter des Typs ... übergeben, ich weiß nicht, wie ich ihn, meine Funktion, mein Callable Object oder etwas ähnliches an meinen Konstruktor schreiben soll. Es ist ein bisschen kompliziert für mich. – song

Verwandte Themen