【发布时间】:2021-02-09 10:34:48
【问题描述】:
这是我的测试代码
class bar
{
public:
explicit bar(int x) : num(x) {}
int get_num()
{
return num;
}
private:
int num;
};
shared_ptr<bar> ptr_store;
void get_func()
{
while (1)
printf("get_num:%d\n", ptr_store->get_num());
};
void set_func()
{
while (1)
//ptr_store = make_shared<bar>(1);
atomic_exchange(&ptr_store, make_shared<bar>(1));
}
int main()
{
ptr_store = make_shared<bar>(-1);
std::thread t1(get_func);
std::thread t2(set_func);
t1.join();
t2.join();
}
我想知道为什么这个程序不会进行核心转储?
如果t1 在t1 使用ptr_store->get_num() 时t2 中的set_func 破坏了原点ptr_store,可能会导致一些故障?
由shared_ptr 保证吗?或者只是巧合。
Test environment:
OS: Ubuntu 20.04 LTS
Clang: clang version 3.9.1
G++: gcc version 7.5.0
更新:
我认为两个线程不可能访问一个对象。
atomic_exchange 或 reset 可以被认为是原子操作。
设置新对象时,不会更改旧对象。
【问题讨论】:
标签: c++ multithreading c++11 shared-ptr stdatomic