如何解决如果在C ++中调用期间对象被销毁了怎么办
这是我的测试代码
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();
}
我想知道为什么该程序不会进行核心转储吗?
如果set_func
使用t2
时ptr_store
中的t1
破坏了原点ptr_store->get_num()
,可能会引起某些故障吗?
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 ++标准中没有“核心转储”之类的东西。这些单词不在词汇表中。存在“未定义的行为”,并且您的程序具有它。有一个data race。
如果多个执行线程在不同步的情况下访问同一std :: shared_ptr对象,并且其中任何访问使用了shared_ptr的非const成员函数,那么除非通过这些函数执行所有此类访问,否则将发生数据争用{{3 }}。
atomic_exchange
还可以,但是您source在另一个线程中。
请注意,所有这些在C ++ 20中已弃用。请改用std::atomic<std::shared_ptr<bar>>
。
现在我通过@n修复我的代码。 '代词'm。的答案。 看来现在工作很好
#include <bits/stdc++.h>
#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <functional>
#include <atomic>
#include <unistd.h>
#include <bits/shared_ptr_atomic.h>
using namespace std;
class bar
{
public:
explicit bar(vector<int> &in) : num(-1)
{
for (auto iter : in)
v.push_back(iter);
}
int get_num()
{
for (auto iter : v)
{
num = max(iter,num);
}
if (num >= 100)
{
printf("Fault %d\n",num);
}
return num;
}
private:
int num;
vector<int> v;
};
shared_ptr<bar> ptr_store;
int st;
void get_func()
{
for (int k = 0; k <= 10000; k++)
{
auto temp = atomic_load_explicit(&ptr_store,std::memory_order_seq_cst);
printf("Get_num %d\n",temp->get_num());
}
}
void set_func()
{
for (int k = 0; k <= 10000; k++)
{
vector<int> v;
int sz = rand() % 100;
for (int i = 0; i < sz; i++)
v.push_back(rand() % 100);
atomic_exchange(&ptr_store,make_shared<bar>(v));
}
}
int main()
{
srand((unsigned)time(NULL));
vector<int> v = {1,2,3};
ptr_store = make_shared<bar>(v);
std::thread t1(get_func);
std::thread t2(set_func);
t1.join();
t2.join();
}
// g++ atomic_exchange.cpp -o atomic_exchange -pthread && ./atomic_exchange > atomic_exchange.out
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。