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&lt;pointer_t&gt; 上调用负载,而不是在 pointer_t 上调用 【参考方案1】:

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

【讨论】:

@Drew Dormann :在 gcc 4.8.4 本身中是否有任何补丁/解决方案可以避免这种情况? @rahul.deshmukhpatil 是的,需要指定指针的对齐方式为两个字。 我不小心更改了基类对象地址,所以看起来原子数据成员变量分配在奇数地址上。感谢您的回复。 我只是想知道这个错误是否已在 CentOS 7.3 的默认 gcc 编译器中修复? 如何指定对齐为两个单词,举个例子?谢谢

以上是关于std::atomic 负载中的段错误?的主要内容,如果未能解决你的问题,请参考以下文章

Windows:处理所有线程中的段错误

getline 中的段错误

函数调用中的段错误

生产者消费者程序中的段错误

C中多线程python扩展中的段错误

atoi(str) 中的段错误