在书上看到这个例子:
划线处使用 swap 方式,而不是 data_=newData,解释是:使旧数据的析构发生在临界区外,缩小临界区的范围,但是我理解通过这种方式,newData 虽然指向了旧数据的引用,但是出了 if 判断作用域引用不也为 0 ,也会产生析构啊,不知道是哪理解错了?
1
codehz 2023-06-06 19:48:40 +08:00
所以这个函数在 C++20 就直接移除了
|
3
codehz 2023-06-06 19:56:45 +08:00
被移除的是 unique(),因为多线程环境下不能确保不会出现 toctou 的问题(
---- 整个判定 unique 的方法就不对,如果到处都有 lock 保护,那判不判断 unique 都一样 唯一想到的用例就是懒拷贝,此时 mutex 可能不是同一个,那还是有 toctou 的问题,可能在判定 unique 的时候它还是 unique 的,但是到了更新的时候就不 unique 了 |
5
codehz 2023-06-06 20:17:24 +08:00
@kkkbbb 你是说在 if !unique 里面不用 data_=newData ?那说明文章在脱裤子放屁
operator=的实现基本上等价于 shared_ptr<T>(r).swap(*this); return *this; 它这里手动复制 Map ,除非 MapPtr 里有做什么 non trivial 的事情,否则基本上可以认为没有区别 |
7
codehz 2023-06-06 21:27:11 +08:00
@kkkbbb 但也就复制一份右侧的而已,而右侧的无论如何也不会在这个位置和别人共享访问,所以没有区别(除了多复制一次)
要避免额外复制的话,用 std::move()让它移动过去就可以了) |
8
kkkbbb OP 乌龙了,图片上的代码和书上还有点区别,书上的 lock 临界区是在 if 作用域里,所以解释的没问题。
|