2012-12-18 13 views
6

Ich versuche __atomic_load_n von der gccatomic builtins Seite nutzen zu können, mitMit gcc atomare Builtins?

gcc -Wall -march=i686 -std=gnu99 ll.c -o ll 

kompilieren, aber es sagt mir, es kann nicht

warning: implicit declaration of function ‘__atomic_load_n’ 

Ich dachte, es wäre genug gcc mit den zur Verfügung zu stellen arch und die march Flags (und dafür gesorgt, indem Sie die std=gnu99 Flag setzen), aber ohne Erfolg. In der Tat, auch wenn ich für die gemeinsamen __GCC_VERSION__ oder __GNUC__ Makros zu testen scheinen nicht Werte zu haben ... aber ich habe eine schöne Vanille gcc Installation, die, die in Unbuntu kommt.

Ich weiß, ich mache etwas albern, aber ich kann nicht herausfinden, was. Ich habe gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

Code sieht so aus: es ist eine Funktion, die (noch) nie aufgerufen wird, so ist das Problem zur Kompilierzeit.

type* func(type* p) { 
    type* q = __atomic_load_n (p, __ATOMIC_SEQ_CST); 
} 
+0

Können Sie uns den Code zeigen, der Ihnen den Fehler gibt? – NPE

+0

@NPE: Sicher, die Fragen wurden aktualisiert. –

+1

Ich kann Ihren Code kein Problem (gcc 4.7.2) kompilieren, sobald ich Typdef 'type' in' int' tippe. Wenn Sie ein Problem mit Ihrer Compiler-Installation vermuten, versuchen Sie vielleicht, ein nicht-trivales, aber sauberes Projekt damit zu erstellen, um zu sehen, was passiert? – NPE

Antwort

13

Bis GCC 4.6.3 Compiler eingebaute Funktionen für atomare Operationen waren eine reine Compiler-Erweiterung, und in GCC wurden sie in die __sync_* Familie von Funktionen gruppiert.

Ab Version 4.7.0 wurden sowohl die neuen C++ 11- als auch die C11-Standards fertiggestellt, und GCC aktualisierte ihre atomaren Einbauten, um das neue Speichermodell dieser beiden neuen Sprachrevisionen besser widerzuspiegeln. Die neuen Funktionen sind in der __atomic_* Familie zusammengefasst.

jedoch die älteren Einbauten sind still available und die documentation sagt dies:

Es ist immer sicher einen __sync Anruf mit einem __atomic Anruf mit dem __ATOMIC_SEQ_CST Speichermodell zu ersetzen.

+0

Während '__ATOMIC_SEQ_CST' immer gültig ist, kann es Ihnen ziemlich suboptimale Ergebnisse geben, abhängig von dem Speichermodell Ihrer CPU. –

+0

Danke, gut beantwortet! –