2015-04-23 148 views
7

在Linux中,使用gcc 4.8.4,与-std = C++ 11 -mcx16编译:std :: atomic load中的Segfault?

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

给出了当load被称为段错误。我如何初始化原子值?

+0

就像旁注一样,'_t'后缀是在POSIX系统上保留的。 –

+0

我没有看到'pointer_t :: load()'的任何声明...... – Kevin

+0

@BetaCarotin是的,我只是直接翻译https://www.cs.rochester.edu/research/synchronization/pseudocode/ queues.html :) –

回答

8

原来这是gcc中的bug,后来在GCC 5.1中被修复。指定对齐为两个单词修复它。

+0

@Drew Dormann:是否有任何补丁/解决方案可以在gcc 4.8.4本身中避免这种情况? –

+0

@ rahul.deshmukhpatil是的,您需要指定指针的对齐方式为两个单词。 –

+0

我不小心改变了基类的对象地址,所以出现原子数据成员变量被分配到了奇数地址。谢谢回复。 –

相关问题