2015-04-23 9 views
7

Unter Linux mit gcc 4.8.4, mit -std kompiliert = C++ 11 -mcx16:Segfault in std :: Atomlast?

#include <atomic> 

struct node_t; 

struct pointer_t { 
     node_t* ptr; 
     unsigned int count; 
     pointer_t() noexcept : ptr{nullptr}, count{0} {} 
}; 

struct empty {}; 

struct node_t { 
     empty value; 
     std::atomic<pointer_t> next; 
     node_t() : next{pointer_t{}} {} 
}; 

int main() { 
     node_t{}.next.load(); 
     return 0; 
} 

eine segfault gibt, wenn load genannt wird. Wie soll ich einen atomaren Wert initialisieren?

+0

Nur als Nebenbemerkung ist das Suffix '_t auf POSIX-Systemen reserviert. –

+0

Ich sehe keine Deklaration von 'pointer_t :: load()' irgendwo ... – Kevin

+0

@BetaCarotin yeah, ich bin nur direkt übersetzen https://www.cs.rochester.edu/research/synchronization/pseudocode/ queues.html :) –

Antwort

8

Es ist eine bug in gcc, die seit GCC 5.1 behoben wurde. Angeben der Ausrichtung, um zwei Wörter zu sein, reparierte es.

+0

@Drew Dormann: Gibt es einen Patch/Lösung, die dies in gcc 4.8.4 selbst vermeiden könnte ? –

+0

@ rahul.deshmukhpatil Ja, Sie müssen die Ausrichtung des Zeigers als zwei Wörter angeben. –

+0

Ich habe versehentlich die Objektadresse der Basisklasse geändert. Daher wurde angezeigt, dass die atomare Datenelementvariable der ungeraden Adresse zugewiesen wurde. danke für die Antwort. –