代码编织梦想

在多线程的编译环境中,调用不同shared_ptr实例的成员函数是不需要额外的同步手段的,即使这些shared_ptr拥有的是同样的对象。

但是如果多线程“访问(有写操作)”同一个shared_ptr,则需要同步,否则就会有race condition发生。也可以使用shared_ptr overloads of atomic functions来防止race condition的发生。

多个线程同时同一个shared_ptr对象是线程安全的,但是,如果是多个线程对同一个shared_ptr对象进行读和写,则需要加锁。

多线程读写shared_ptr所指向的同一个对象,
不管是相同的shared_ptr对象,还是不同的shared_ptr对象,都需要加锁保护。

eg:

shared_ptr<long>global_instance=make_shared<long>(0);
std::mutex g_i_mutex;void thread_fcn() 
{
//std::lock_guard<std::mutex>lock(g_i_mutex);
//shared_ptr<long>local=global_instance;    
   for(int i=0; i<100000000; i++)    
   {        
      *global_instance = *global_instance + 1;        //*local=*local+1;    
   }
}
void main() {    
  thread thread1(thread_fcn);    
  thread thread2(thread_fcn);                
  thread1.join();    
  thread2.join();      
  cout<<"*global_instance is"<<*global_instance;
}

在线程函数thread_fcn的for循环中,2个线程同时对global_instance进行加1的操作。这就是典型的非线程安全的场景,最后的结果是未定的,
运行结果为:*global_instance is197240539;

如果使用的是每个线程的局部shared_ptr对象local,因为这些local指向相同的对象,因此结果也是未定的,
运行结果为:*global_instance is160285803;

因此,这种情况下必须加锁,将thread_fcn中的第一行代码的注释去掉之后,不管是使用global_instance,还是使用local,
得到的结果都是:*global_instance is 200000000

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

int main()
{
    shared_ptr<int> sp1(new int(100));
    cout << "当前计数: " << sp1.use_count() << endl;//1
    auto sp2 = sp1;
    cout << "当前计数: " << sp1.use_count() << endl;//2
    {
        auto sp3 = sp2;
        cout << "当前计数: " << sp1.use_count() << endl;//3
    }
    cout << "当前计数: " << sp1.use_count() << endl;//2
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_52668597/article/details/129479877

shared-爱代码爱编程

shared_ptr线程安全性分析 正如《STL源码剖析》所讲,“源码之前,了无秘密”。本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如何保证文档所宣称的线程安全性。本文的分析基于boost 1.52版本,编译器是VC 2010。 shared_ptr的线程安全性 boost官方

为什么多线程读写 shared_ptr 要加锁? --shared_ptr的线程安全性_amoscykl的博客-爱代码爱编程_shared_ptr 线程安全

在《Linux 多线程服务端编程:使用 muduo C++ 网络库》第 1.9 节“再论 shared_ptr 的线程安全”中写道: (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/

【c++】shared-爱代码爱编程

 看下面的代码我们就会发现shared_ptr在多线程的情况下会出问题: void test_multi_thread_copy(yan::shared_ptr<int>& sp,size_t n)//把智能指针拷贝n次 { for (size_t i = 0; i < n; i++) { yan::shared_ptr

智能指针shared_ptr的线程安全、互斥锁_鬼 | 刀的博客-爱代码爱编程

                                        智能指针和线程安全的问题 <1>  智能指针shared_ptr本身(底层实现原理是引用计数)是线程安全的 智能指针的引用计数在手段上使用了atomic原子操作,只要shared_ptr在拷贝或赋值时增加引用,析构时减少引用就可以了。首先原子是线程安全的,所有

shared_ptr的线程安全性_dxt00的博客-爱代码爱编程_shared_ptr线程安全

shared_ptr的线程安全性   shared_ptr的reference count是线程安全的,但是指向的对象不是线程安全的!     本文链接:https://blog.csdn.net/D_Guco/article/details/80155323     shared_ptr的出现在某种程度上解放了c++程序员,c++11标准原生

shared_ptr线程安全问题-爱代码爱编程

  shared_ptr 是引用计数型(reference counting)智能指针,几乎所有的实现都采用在堆(heap)上放个计数值(count)的办法。 官方对shared_ptr基本介绍: http://en.cppreference.com/w/cpp/memory/shared_ptr madn:https://docs.microsof

c++11总结15——shared_ptr在多线程下的安全性问题-爱代码爱编程

1. 引用 boost官方文档中有如下结论: 1)同一个shared_ptr被多个线程“读”是安全的; 2)同一个shared_ptr被多个线程“写”是不安全的; 3)共享引用计数的不同的shared_ptr被多个线程”写“ 是安全的; 2. 线程安全 shared_ptr指针类有两个成员变量,一个是指向变量的指针;一个是资源被引用的次数,引用

printf怎么输出? 如何正确使用%s,%c,%d,%p?=>这篇详解用法-爱代码爱编程

//printf怎么输出? //=>如何正确使用%s,%c,%d,%p %d试例 /* include<stdio.h> int main(void) { int a[36] = { 1,2,3,4,5 }; printf("%d", *a);//=>一个 =>*a是值 return 0; }=>输出1 *

C++11的std::shared_ptr 是否是线程安全-爱代码爱编程

结论:指针和引用计数是线程安全的,但指针所指对象中的操作就需要自己做控制,并不是线程安全的。因为shared_ptr 有两个数据成员(指向被管理对象的指针,和指向控制块的指针),读写操作不能原子化。 std::shared_ptr大概总结有以下几点: (1) 智能指针主要的用途就是方便资源的管理,自动释放没有指针引用的资源。 (2) 使用引用

智能指针shared_ptr的原理、用法和注意事项-爱代码爱编程

智能指针shared_ptr的原理、用法和注意事项 1 前言2 shared_ptr原理3 share_ptr的基本用法3.1 初始化3.2 获取原始指针3.3 指定删除器4 使用share_ptr需要注意的问题 1 前言 在实际的C++开发过程中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用的内存越来越多最终不得不重启等问题,这些问题

c++ shared_ptr的线程安全性_梦里汉唐的博客-爱代码爱编程

源码探析 根据 glibc 源码绘制 UML 如下图所示: 接下来阅读 _Sp_counted_base::_M_release() 的源码: template <_Lock_policy _Lp = __default_lock_policy> class _Sp_counted_base : public _Mutex_bas

shared_ptr的线程安全性探讨_zsiming的博客-爱代码爱编程

文章目录 1. 问题陈述2. 过程剖析 1. 问题陈述 在 一文详解C++11的三种智能指针中,我们详细探讨了C++11中提供的三种智能指针的应用场景以及shared_ptr的实现。今天需要探讨的是:shar

boost shared-爱代码爱编程

转   http://blog.csdn.net/jiangfuqiang/article/details/8292906 1 同一个shared_ptr对象可以被多线程读 2 多个shared_ptr对象、但指向同一raw_pointer的, shared_ptr本身可以被多线程读写; 但是底层指针指向的对象的多线程安全性无任何保证。 3 多

智能指针shared_ptr、unique_ptr、weak_ptr_智能指针 弱指针能 给 shared_ptr 效率-爱代码爱编程

智能指针 智能指针解决的问题智能指针分类shared_ptr内存模型图shared_ptr示例shared_ptr含义shared_ptr基本用法及常用函数常用函数智能指针的构造,初始化-make_shared

shared_ptr初始化、循环引用、线程安全问题-爱代码爱编程

循环引用,两个对象相互使用shared_ptr指向对方 使用shared_ptr需要注意的问题 1、不要用一个原始指针初始化多个shared_ptr,原因在于,会造成二次销毁, 如下所示: int *p5 = ne