shared_ptr的线程安全

2020-04-03  本文已影响0人  JimmyPan

读到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

上一篇 下一篇

猜你喜欢

热点阅读