shared_ptr的线程安全
2020-04-03 本文已影响0人
JimmyPan
读到muduo大大的网络编程,对shared_ptr到底哪部分是线程安全,哪部分不是线程安全的产生了一些疑问
1.shared_ptr中的control block是线程安全的

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