美文网首页
shared_ptr的线程安全

shared_ptr的线程安全

作者: JimmyPan | 来源:发表于2020-04-03 12:41 被阅读0次

读到muduo大大的网络编程,对shared_ptr到底哪部分是线程安全,哪部分不是线程安全的产生了一些疑问

1.shared_ptr中的control block是线程安全的

shared_ptr

ref_count所指的部分即使control block

所以如下情况,操作control block是线程安全的,对data_ptr只有指针的读取

一个全局的shared_ptr

shared_ptr<int> global_ptr;

线程1到N运行:

void threadFunc(){
 shared_ptr<int> local=shared_ptr = global_ptr;
}

这一部分的复制和析构,操作引用计数,是线程安全的

2.对shared_ptr本身的读写是线程不安全的

一次读写操作分为两步,改变control block的指针,改变content的指针,而这两步并不属于一个原子操作。
并发执行时的,这两部的执行顺序会引发问题。具体race condition的分析:https://blog.csdn.net/solstice/article/details/8547547

所以如下情况是线程不安全的

一个全局的shared_ptr

shared_ptr<int> global_ptr;

线程1运行:

void threadFunc1(){
  while(1){
   shared_ptr<int> local=shared_ptr = global_ptr; //read
  }
}

线程2运行:

void threadFunc2(){
   while(1){
   global_ptr=make_shared<int>(1); //write
  }
}

在这种情况下就会出现空指针,或者doublefree的错误

3.weak_ptr与shared_ptr结合的线程安全

Lock

当我们使用lock去获取shared_ptr时,是线程安全的,如上图,判断是否可以用和返回指针这两步是一个原子操作,文档连接:
https://en.cppreference.com/w/cpp/memory/weak_ptr/lock

相关文章

  • shared_ptr的线程安全

    读到muduo大大的网络编程,对shared_ptr到底哪部分是线程安全,哪部分不是线程安全的产生了一些疑问 1....

  • shared_ptr的线程安全

    陈硕的文章:https://blog.csdn.net/solstice/article/details/8547...

  • C++多线程下的shared_ptr

    来看一下boost文档下给出的shared_ptr的多线程读写的例子 shared_ptr引用计数是原子的,它的析...

  • 智能指针线程安全问题

    智能指针是线程安全的吗?(以shared_ptr为例) 概述 前一阶段面试被别人问到了,第一反应是和普通对象一样,...

  • shared_ptr

    少奋斗奋斗 shared_ptr g(newFoo);// 线程之间共享的 shared_ptrshared_pt...

  • [转]为什么多线程读写 shared_ptr 要加锁?

    (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成...

  • 智能指针的线程安全

    参考 为什么多线程读写 shared_ptr 要加锁? boost官方文档 shared_ptr_thread_s...

  • atomic & nonatomic

    什么是线程安全??? 线程安全:多线程操作共享数据不会出现想不到的结果就是线程安全的,否则,是线程不安全的。 at...

  • HashMap 和 Hashtable 的区别

    线程安全: HashMap 是非线程安全的,而 Hashtable 是线程安全的,因为 Hashtable 内部的...

  • Java 的 StringBuffer 和 StringBuil

    区别就是:线程安全,StringBuffer 是线程安全的,StringBuilder 不是线程安全的。 他俩的实...

网友评论

      本文标题:shared_ptr的线程安全

      本文链接:https://www.haomeiwen.com/subject/xhccphtx.html