在多线程环境下对同一个shared_ptr对象读操作没有问题,它的引用计数是原子的,安全且无锁,但是如果是多线程下有读写操作,以及对shared_ptr指向的对象有读写操作,那么就会发生竞争。shared_ptr多线程问题的本质是它所指向的对象的引用计数是否会因为多线程环境而出错,后一种情况就相当于普通指针,或认为是int写操作。
由于shared_ptr的操作主要含有两个步骤:复制指针和引用计数加一,所以这两步在多线程中会有问题。所以对于多线程读写shared_ptr结论是: 同一个shared_ptr被多线程读,线程安全; 同一个shared_ptr被多线程写,不是线程安全; 共享引用计数的不同的shared_ptr被多线程写,是线程安全。 引用计数线程安全吗 但是在shared_...
智能指针有用过吗,说一下他们的实现原理? shared_ptr的计数器底层是怎么实现的?(我不知道,面试官说没关系按照你自己的理解你会怎么设计,我就回答,用一个哈希表,存放资源地址和对应的指针) 那这个哈希表是全局的吗?是线程安全的吗?(是全局的,关于线程安全,我就说给他加锁) ...
9、智能指针的循环引用问题如何解决 10、为什么需要智能指针 11、TCP的三次握手和四次挥手 12、TCP的可靠性传输 13、一般程序都很大,物理内存不够怎么办(主要是想让我说虚拟内存的原理,脑子糊了) 14、进程和线程的区别 15、保证线程安全的方法有哪些(互斥量、读写锁、条件变量、原子变量、线程本地存储) ...
1.智能指针对象中引用计数是多个智能指针对象共享的,两个线程中智能指针的引用计数同时++或者--,这个操作不是原子的,引用计数原来是1,++了两次,可能还是2,这样引用计数就乱了,有可能造成资源未释放或者程序崩溃的风险。所以说智能指针中++或--的操作是需要加锁的,也就是说引用计数的操作是线程安全的...
而创建线程对象需要传入线程编号、线程要执行的历程以及执行例程的参数线程池指针 this。为什么执行例程 Routine 要加 static 修饰呢?因为类的成员函数的第一个参数默认就是 this 指针,如果 Routine 不加 static 修饰,那么 Routine 将会有两个参数 this 指针和 void* args。这无法满足创建线程时传入返回值为 void*,...
1.安全性 在多线程环境下对同一个shared_ptr对象读操作没有问题,它的引用计数是原子的,安全且无锁,但是如果是多线程下有读写操作,以及对shared_ptr指向的对象有读写操作,那么就会发生竞争。shared_ptr多线程问题的本质是它所指向的对象的引用计数是否会因为多线程环境而出错,后一种情况就相当于普通指针,或认为是...