Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果在C+;中调用时对象被销毁,该怎么办+;_C++_Multithreading_C++11_Shared Ptr_Stdatomic - Fatal编程技术网

C++ 如果在C+;中调用时对象被销毁,该怎么办+;

C++ 如果在C+;中调用时对象被销毁,该怎么办+;,c++,multithreading,c++11,shared-ptr,stdatomic,C++,Multithreading,C++11,Shared Ptr,Stdatomic,这是我的测试代码 类栏 { 公众: 显式条(intx):num(x){} int get_num() { 返回num; } 私人: int-num; }; 共享存储; void get_func() { 而(1) printf(“get_num:%d\n”,ptr_store->get_num()); }; 无效集_func() { 而(1) //ptr_存储=使_共享(1); 原子交换(&ptr_存储,使_共享(1)); } int main() { ptr_存储=使_共享(-1); std:

这是我的测试代码

类栏
{
公众:
显式条(intx):num(x){}
int get_num()
{
返回num;
}
私人:
int-num;
};
共享存储;
void get_func()
{
而(1)
printf(“get_num:%d\n”,ptr_store->get_num());
};
无效集_func()
{
而(1)
//ptr_存储=使_共享(1);
原子交换(&ptr_存储,使_共享(1));
}
int main()
{
ptr_存储=使_共享(-1);
std::线程t1(get_func);
std::线程t2(set_func);
t1.join();
t2.连接();
}
我想知道为什么这个程序不会进行核心转储

如果
t2
中的
set_func
t1
使用
ptr_store->get_num()
时销毁源
ptr_store
,是否会导致某些故障? 它是否由
共享\u ptr
保证?或者这只是巧合

Test environment:
OS: Ubuntu 20.04 LTS
Clang: clang version 3.9.1
G++: gcc version 7.5.0 
更新: 我认为两个线程不可能访问一个对象。
原子交换
重置
可被视为原子操作。 设置新对象时,不会更改旧对象

我想知道为什么这个程序不会进行核心转储

< C++标准中没有“核心转储”这样的东西。这些单词不在词汇表中。有“未定义的行为”,你的程序有它。有一个问题

如果多个执行线程在没有同步的情况下访问同一个std::shared_ptr对象,并且其中任何一个访问使用shared_ptr的非常量成员函数,则将发生数据争用,除非所有此类访问都是通过这些函数执行的

atomic_交换
可以,但您在另一个线程中


注意所有这些在C++20中都是不推荐的。改用
std::atomic

现在我用@n来修复我的代码代词“m.”的答案。 它现在似乎工作得很好

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
分类栏
{
公众:
显式条形图(矢量和输入):num(-1)
{
用于(自动iter:in)
v、 推回(iter);
}
int get_num()
{
用于(自动iter:v)
{
num=最大值(iter,num);
}
如果(数值>=100)
{
printf(“错误%d\n”,num);
}
返回num;
}
私人:
int-num;
向量v;
};
共享存储;
int st;
void get_func()
{
for(int k=0;k get_num());
}
}
无效集_func()
{
for(int k=0;k原子交换

但是,请注意,C++20中不推荐使用此版本的
原子加载
!您应该将全局指针改为
std::atomic
。@SebastianRedl是的,原子交换也不推荐使用,添加了一个注释……UB并不意味着“需要崩溃”。它字面上意味着任何事情都可能发生,您必须查看由一个特定CPU的特定实现生成的asm,以了解发生了什么。其他效果也很常见,比如释放后使用,而释放的内存只是在空闲列表上,而不是未映射。