In Glibc der pthread.h
der pthread_self
Funktion wird mit dem const
Attribut deklariert:Warum Pthread_self ist mit Attribut (const) markiert?
extern pthread_t pthread_self (void) __THROW __attribute__ ((__const__));
In GCC that attribute means:
Viele Funktionen untersuchen keine Werte außer ihre Argumente und haben keine Auswirkungen, außer der Rückkehr Wert. Im Grunde genommen ist dies nur eine geringfügig strengere Klasse als das unten stehende pure-Attribut, da es der Funktion nicht erlaubt ist, globalen Speicher zu lesen.
Ich frage mich, wie das sein soll? Da es kein Argument braucht, pthread_self
ist daher nur erlaubt immer den gleichen Wert, was offensichtlich nicht der Fall ist. Das heißt, würde ich pthread_self
erwartete globale Speicher zu lesen, und deshalb schließlich als pure
stattdessen markiert werden:
Viele Funktionen haben keine Auswirkungen außer dem Rückgabewert und dessen Rückgabewert hängt nur von den Parametern und/oder global Variablen. Eine solche Funktion kann einer gemeinsamen Teilausdruckseliminierung und Schleifenoptimierung unterzogen werden, genau wie es ein arithmetischer Operator wäre. Diese Funktionen sollten mit dem Attribut pure deklariert werden.
Die Implementierung kann auf x86-64 scheint tatsächlich zu lesen globale Speicher zu sein:
# define THREAD_SELF \
({ struct pthread *__self; \
asm ("mov %%fs:%c1,%0" : "=r" (__self) \
: "i" (offsetof (struct pthread, header.self))); \
__self;})
pthread_t
__pthread_self (void)
{
return (pthread_t) THREAD_SELF;
}
strong_alias (__pthread_self, pthread_self)
Ist das ein Bug oder bin ich nicht etwas zu sehen?
Es gibt immer den gleichen Wert * in einem bestimmten Thread *. Wenn Sie eine reine Funktion aufrufen, eine globale Variable ändern und dann erneut aufrufen, erhalten Sie möglicherweise einen anderen Rückgabewert. Wenn Sie keine globale Variable dazwischen ändern und die Parameter identisch sind, kann der Compiler davon ausgehen, dass der Rückgabewert derselbe ist. Dies kann nicht mit einer '__const__'-Funktion wie' pthread_self() 'geschehen, weil der Rückgabewert nicht vom Wert globaler Variablen abhängt. Die Tatsache, dass es einen anderen Wert in einem anderen Thread zurückgibt, ist für das, was hier passiert, nicht wirklich relevant. –
Dieser Speicher ist nicht wirklich global, sondern ist im '% fs'-Segment ein spezielles Segment, das normalerweise lokalen Thread-Speichern gewidmet ist. Es greift also tatsächlich auf lokalen Thread-Speicher zu. – rodrigo
@PaulGriffiths: IOW gibt es Wechselwirkungen mit 'pure'-ness und' const'-ness und Multithreading. Schön genug, aber das erklärt nicht, wie 'pthread_self' implementiert werden kann, ohne sogar irgendeinen globalen Speicher zu lesen? – peppe