std::atomic 负载中的段错误?
Posted
技术标签:
【中文标题】std::atomic 负载中的段错误?【英文标题】:Segfault in std::atomic load? 【发布时间】:2015-04-23 13:14:10 【问题描述】:在 linux 上,使用 gcc 4.8.4,使用 -std=c++11 -mcx16 编译:
#include <atomic>
struct node_t;
struct pointer_t
node_t* ptr;
unsigned int count;
pointer_t() noexcept : ptrnullptr, count0
;
struct empty ;
struct node_t
empty value;
std::atomic<pointer_t> next;
node_t() : nextpointer_t
;
int main()
node_t.next.load();
return 0;
在调用load
时给出段错误。我该如何初始化一个原子值?
【问题讨论】:
作为旁注,_t
后缀在 POSIX 系统上是保留的。
我在任何地方都没有看到pointer_t::load()
的声明...
@BetaCarotin 是的,我只是直接翻译cs.rochester.edu/research/synchronization/pseudocode/… :)
@Kevin 我在 std::atomic<pointer_t>
上调用负载,而不是在 pointer_t
上调用
【参考方案1】:
原来这是 gcc 中的 bug,此后已在 GCC 5.1 中修复。将对齐指定为两个单词即可修复它。
【讨论】:
@Drew Dormann :在 gcc 4.8.4 本身中是否有任何补丁/解决方案可以避免这种情况? @rahul.deshmukhpatil 是的,需要指定指针的对齐方式为两个字。 我不小心更改了基类对象地址,所以看起来原子数据成员变量分配在奇数地址上。感谢您的回复。 我只是想知道这个错误是否已在 CentOS 7.3 的默认 gcc 编译器中修复? 如何指定对齐为两个单词,举个例子?谢谢以上是关于std::atomic 负载中的段错误?的主要内容,如果未能解决你的问题,请参考以下文章