2014-09-15 3 views
10

Ich bin verwirrt. Wie ist es möglich, dass die Implementierung weiß, ob der Typ nur zur Laufzeit atomar ist?Warum ist nicht std :: atomic_is_lock_free ein statischer consExpr?

+8

Beachten Sie die Kommentare zu [cppreference.com] (http://en.cppreference.com/w/cpp/atomic/atomic_is_lock_free) über ausgerichtete und falsch ausgerichtete Objekte. – Angew

+0

Es gibt auch Makros wie 'ATOMIC_INT_LOCK_FREE' für grundlegende Typen, die Sie zur Kompilierzeit überprüfen können. – interjay

+0

@Angew ja, aber ich fragte speziell nach 'std :: atomic_is_lock_free()' anstelle von 'std :: atomic :: is_lock_free()' (Member-Funktion). 'std :: atomic_is_lock_free' kennt nur den Typ. Wenn der Typ eine schlechte Ausrichtung hat, ist er zur Laufzeit bekannt. – GreenScape

Antwort

5

Der Compiler kann möglicherweise nicht wissen, auf welcher CPU der Code ausgeführt wird, und CPUs können sich in ihren sperrfreien Funktionen unterscheiden. Zum Beispiel unterstützt eine CPU möglicherweise keine atomaren Operationen auf long Typen (und daher kann eine Sperre erforderlich sein), aber wenn das System nur einen einzelnen Kern hat, können sie automatisch atomar sein, weil sie nicht unterbrochen werden können und es keinen anderen Kern gibt Rennen mit (und so nichts Besonderes ist erforderlich und der Typ ist frei von Sperren).

+3

Wenn der Compiler nicht wissen würde, ob die CPU eine Sperre benötigt oder nicht, wie könnte er garantieren, dass der generierte Code datenrasenfrei ist? – ComicSansMS

+0

@ComicSansMS Zur Laufzeit wird entschieden, ob Sperrcode oder Sperrcode verwendet werden soll. Ich habe Code geschrieben, der das immer gemacht hat, damals, als Single-Core-Systeme die Norm waren. –

+0

Ich kann sehen, warum man das im Benutzercode machen möchte, aber ich wäre ziemlich überrascht, wenn ein Compiler Code wie diesen generiert hätte. Aber ich kann sehen, wie es in bestimmten Fällen eine gültige Optimierung wäre, wenn der Compiler in der Lage ist, Code zu erzeugen, um den Nur-Ein-Prozessor-Fall zuverlässig zu erkennen. Kennen Sie Compiler, die das tatsächlich tun? – ComicSansMS

Verwandte Themen