多线程访问共享对象的线程安全问题

简介: 既然是共享对象,就会一个问题,如果两根指针管理同一份资源,delete其中一根指针,造成资源释放指针置空,但是另外另外一根指针却没有被,就会产生非法访问问题。为了解决这个问题我们同样是用强智能指针定义,弱智能指针观察来进行解决。本文将简单介绍这种方法。

下面我们直接看代码。

#include <iostream>#include <thread>#include <memory>usingnamespacestd;
classA{
public:
A()
    {
cout<<"A()"<<endl;
    }
~A()
    {
cout<<"~A()"<<endl;
    }
voidtestA()
    {
cout<<"非常好用的方法!"<<endl;
    }
};
//子线程voidhandler01(weak_ptr<A>pw)
{
// q访问A对象的时候,需要侦测一下A对象是否存活,保证访问的这块内存是合法的std::this_thread::sleep_for(std::chrono::milliseconds(200));
shared_ptr<A>sp=pw.lock(); 
if (sp!=nullptr) // 提升成功资源合法    {
sp->testA();
    }
else//否则资源已经释放    {
cout<<"A对象已经析构,不能再访问"<<endl;
    }
}
//main线程intmain(void)
{
    {
shared_ptr<A>p(newA());
threadt1(handler01, p);
t1.detach();
    } // 出了大括号资源已经释放,另外一根指针就无法访问std::this_thread::sleep_for(std::chrono::seconds(20));
//t1.join();return0;
}

结合代码和注释下次遇到这种问题的时候我们应该就应该要有一些思考了。


相关文章
|
20天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
1月前
|
存储 缓存 NoSQL
Redis单线程已经很快了6.0引入多线程
Redis单线程已经很快了6.0引入多线程
31 3
|
1月前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
64 0
|
5天前
|
安全 算法 Java
JavaSE&多线程&线程池
JavaSE&多线程&线程池
126 7
|
6天前
|
存储 缓存 NoSQL
为什么Redis使用单线程 性能会优于多线程?
在计算机领域,性能一直都是一个关键的话题。无论是应用开发还是系统优化,我们都需要关注如何在有限的资源下,实现最大程度的性能提升。Redis,作为一款高性能的开源内存数据库,因其出色的单线程性能而备受瞩目。那么,为什么Redis使用单线程性能会优于多线程呢?
19 1
|
13天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
16 1
|
28天前
|
安全 Java 容器
Java并发编程:实现高效、线程安全的多线程应用
综上所述,Java并发编程需要注意线程安全、可见性、性能等方面的问题。合理使用线程池、同步机制、并发容器等工具,可以实现高效且线程安全的多线程应用。
14 1
|
28天前
|
JavaScript 前端开发
JS 单线程还是多线程,如何显示异步操作
JS 单线程还是多线程,如何显示异步操作
22 2
|
1月前
|
算法 安全 Unix
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
31 0
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结