2015-04-23 2 views
7

В Linux, с помощью GCC 4.8.4, составленный с -std = C++ 11 -mcx16:Segfault в std :: атомная нагрузка?

#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; 
} 

дает Segfault когда load называется. Как я хотел инициализировать атомную ценность?

+0

Как и в случае сбоя, суффикс '_t' зарезервирован для систем POSIX. –

+0

Я не вижу объявления 'pointer_t :: load()' в любом месте ... – Kevin

+0

@BetaCarotin да, я просто прямо переводил https://www.cs.rochester.edu/research/synchronization/pseudocode/ queues.html :) –

ответ

8

Оказывается, это bug в gcc, который с тех пор был исправлен в GCC 5.1. Указание выравнивания на два слова фиксировало его.

+0

@Drew Dormann: Есть ли патч/решение, которое могло бы избежать этого в gcc 4.8.4 ? –

+0

@ rahul.deshmukhpatil Да, вам нужно указать выравнивание указателя как двух слов. –

+0

Я случайно менял адрес объекта базового класса, поэтому он обнаружил, что переменная члена атома была выделена на нечетном адресе. Спасибо за ответ. –