Gemäß dem C++ 14-Standard werden nicht statische Elementvariablen in der Reihenfolge initialisiert, in der sie in einer Klasse deklariert sind. Der unten stehende Code zur Reduzierung hängt von dieser Regel ab, um eine Thread-Funktion zu steuern. In Abhängigkeit von der Reihenfolge der Initialisierung
class foo
{
foo():
keep_going{true},
my_thread(&foo::go,this)
{}
void go()
{
while(keep_going)
check a std::condition_variable and do some work;
}
bool keep_going;
std::thread my_thread;
}
Beachten Sie, dass keep_going
vor dem Thread-Objekt deklariert wird, und sollte der Faden tritt in die Go-Funktion true
durch die Zeit eingestellt werden. Das ist in Ordnung und scheint in Ordnung zu sein.
Dies ist jedoch multithreaded Code und es zahlt sich paranoid zu sein, so habe ich zwei Fragen:
1 Ist es sicher, wie dies in der Größenordnung von Initialisierung verlassen? Mein reales Objekt macht keinen Sinn ohne den Verarbeitungsthread, also möchte ich es im Konstruktor setzen.
2 Ist es unsicher, anderen Code zu geben, wenn es auf relativ obskuren Dingen wie der Reihenfolge der Initialisierung beruht?
Reihenfolge der Initialisierung ist nicht obskur, es ist gut definiert und es gibt nichts falsch mit diesem Code. – Salgar
1) ja Reihenfolge der Initialisierung ist Teil der Spezifikationen, 2) ja - klare Dokumentation könnte helfen – BeyelerStudios
Ich würde mich darauf verlassen, nur mit einem guten Kommentar zu erklären. Folgen Sie dem Zitat "Immer Code wie Ihr Code Mantainer ist ein Serienmörder, der weiß, wo Sie leben" –