使用自定义类型创建一个原子变量 失败

独孤的根号三 2020-07-13 03:30:19
《Cpp Concurrency In Action》 这本书里提到,我们是可以将自定义类型封装成原子变量的。但是实际操作过程中,发现g++会报错。是我写得不对吗?请教大神解惑。
我的代码如下:

#include <atomic>
#include <iostream>
#include <memory>
using namespace std;

struct AppleD {
int color = 0;
int weight = 3;
int size = 5;
};

int main() {
AppleD b;
atomic<AppleD> a(b);

cout << (a.load()).size << endl;
return 0;
}


简单到不能再简单的代码了,但是一编译就报错:

yang@yanghuang:~/Code/Study$ g++ test.cpp -g -Wall -std=c++11 -o main
/tmp/ccw4rjp1.o:在函数‘std::atomic<AppleD>::load(std::memory_order) const’中:
/usr/include/c++/7/atomic:250:对‘__atomic_load’未定义的引用
collect2: error: ld returned 1 exit status


只是定义出原子类型的对象没事,但是只要一使用store或者load就会报上面的错误。
试着自己重载赋值操作符也没用。

有谁知道是怎么回事吗? 不会是当前g++还不支持吧?
...全文
166 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2020-07-13
  • 打赏
  • 举报
回复
引用 5 楼 独孤的根号三的回复:
[quote=引用 2 楼 真相重于对错 的回复:]你没配置好吧, gcc 9.2.0没问题
加上-latomic 编译选项就可以了。你那边加了这个编译选项吗? 如果使用基本类型,不需要这个编译选项;使用自定义类型就需要这个编译选项。我不懂这是为什么。[/quote] 具体我的能过我也不知道为啥,因为不熟悉gcc,那个是别人配好给我的。看你的错误信息是报库函数没有定义。所以我推测你没有配置好环境。
独孤的根号三 2020-07-13
  • 打赏
  • 举报
回复
引用 2 楼 真相重于对错 的回复:
你没配置好吧, gcc 9.2.0没问题
加上-latomic 编译选项就可以了。你那边加了这个编译选项吗? 如果使用基本类型,不需要这个编译选项;使用自定义类型就需要这个编译选项。我不懂这是为什么。
独孤的根号三 2020-07-13
  • 打赏
  • 举报
回复
引用 2 楼 真相重于对错 的回复:
你没配置好吧, gcc 9.2.0没问题
刚刚更新了gcc-9和g++-9,发现还是不行

yang@yanghuang:~/Code/Study$ g++-9 test.cpp -g -Wall -std=c++11 -o test
/tmp/cc7h2YAe.o:在函数‘std::atomic<AppleD>::load(std::memory_order) const’中:
/usr/include/c++/9/atomic:254:对‘__atomic_load’未定义的引用
collect2: error: ld returned 1 exit status
独孤的根号三 2020-07-13
  • 打赏
  • 举报
回复
引用 2 楼 真相重于对错 的回复:
你没配置好吧, gcc 9.2.0没问题
我现在用的是gcc 7.5.0
真相重于对错 2020-07-13
  • 打赏
  • 举报
回复
你没配置好吧, gcc 9.2.0没问题
独孤的根号三 2020-07-13
  • 打赏
  • 举报
回复
我的编译器类型是 gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 只要将load那一行注释掉就没事,就是不能使用load或者store函数。太奇怪了。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧