2016-07-30 11 views
-3

Wir haben eine gemeinsame Bibliothek, die wir brauchen gefunden Thread-sicher zu machen und wir das einzige, was Problem verursacht werden, ist ein Thread sicher Singletonklasse, in denen wir Sachen wie unten Code haben:Wie erzwingen, dass die Funktion im Konstruktor aufgerufen wird?

int getLocationID(string name) 
{ 
     if(LocationMap.empty()) 
     { 
     populateLocationMap(); 
     } 
     return LocationMap[name]; 
} 

So Problem ist, wenn zwei client-threads rufen diese getLocationID-funktion gleichzeitig auf und beide fanden sie leer während der populateLocationMap, in der wir aus einer datei lesen und locationID und locationName in map einfügen und während dieser parallelen einfügung stürzt unsere bibliothek ab und wir wollen sie nicht setzen Mutex hier, da es die Parallelität und die Populationsfunktion beeinflussen wird, wird einmal aufgerufen. Nun, da dies threadsicher Singleton ist, dachten wir uns, all diese populateFunction in Konstruktor zu setzen und das entspricht unseren Funktionen onal Anforderung auch, aber das Problem ist, wenn wir einige zukünftige Erweiterung haben, wie können wir sicherstellen, dass private Funktion der Klasse nur in Konstruktor aufgerufen werden?

+0

Uhh ... Nennen Sie es im Konstruktor, und fügen Sie einen großen unangenehmen Kommentar, in dieser Funktion, unmissverständlich sagen, dass es nur vom Konstruktor aufgerufen wird? –

+0

ok, also gibt es keine Möglichkeit, über Sprachfunktionen zu erzwingen – Kapil

+0

Ich glaube nicht, dass es eine Sprachfunktion gibt, mit der Sie Methoden als "nur einmal ausführen" markieren können. Wenn Sie wirklich möchten, könnten Sie einige Flags hinzufügen, mit denen überprüft wird, ob die Methode bereits aufgerufen wurde oder nicht. Aber ich denke nicht, dass das eine gute Idee ist. – nshct

Antwort

2

Wie können wir sicherstellen, dass private Funktion der Klasse nur in Konstruktor aufgerufen werden?

Die Lösung, die ich in größeren Embedded-System-Entwicklung verwendet gesehen haben ... rufen Sie den Konstruktor in der ‚main‘ Thread vor alle anderen Threads ausgeführt werden. Dies setzt voraus, dass "LocationMap.empty()" ordnungsgemäß von allen Threads funktioniert, nachdem "populateLocationMap()" ausgeführt wird.

+0

aufrufen Aber wie können Sie jeden zukünftigen Entwickler erzwingen, der Ihren Code wird es auf die gleiche Weise tun ? – Kapil

+1

Wenn Sie von "zukünftiger Entwickler" von einem Entwickler sprechen, der Zugriff auf Ihren Code hat, ist die Antwort klar ... Sie können nichts tun. –

Verwandte Themen