大佬教程收集整理的这篇文章主要介绍了c – 通过复制和交换与两个锁分配,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
struct A { A() = default; A(A const &X); // Assume implements correct locking and copying. A& operator=(A X) { std::lock_guard<std::mutex> lock_data (_mut); using std::swap; swap(_data,x._data); return *this; } private: mutable std::mutex _mut; std::vector<double> _data; };
我相信这个线程安全(记住op =的参数是通过值传递的),我能找到的唯一问题是在地毯下扫描的那个:复制ctor.但是,它是一种罕见的类,它允许复制赋值而不是复制构造,因此在两种选择中都存在同样的问题.
鉴于自我分配是如此罕见(至少在这个例子中)我不介意额外的副本,如果它发生,考虑这个!=& rhs的潜在优化可忽略不计或悲观.与原始策略(下面)相比,是否还有其他理由更喜欢或避免它?
A& operator=(A const &rhs) { if (this != &rhs) { std::unique_lock<std::mutex> lhs_lock( _mut,std::defer_lock); std::unique_lock<std::mutex> rhs_lock(rhs._mut,std::defer_lock); std::lock(lhs_lock,rhs_lock); _data = rhs._data; } return *this; }
顺便说一句,我认为这简洁地处理了复制文件,至少在本课程中,即使它有点迟钝:
A(A const &X) : _data {(std::lock_guard<std::mutex>(x._mut),x._data)} {}
std :: vector的容量不参与其值.如果lhs相对于rhs具有足够的容量,那么重复使用该容量而不是将其丢弃到临界状态,可以获得性能提升.
例如:
std::vector<int> v1(5); std::vector<int> v2(4); ... v1 = v2;
在上面的示例中,如果v1保持其分配的能力,则可以在没有堆分配或释放的情况下完成分配.但是如果vector使用交换习惯用法,那么它会进行一次分配和一次释放.
我注意到,就线程安全而言,两种算法都锁定/解锁两个锁.虽然交换变体避免了同时锁定它们的需要.我相信平均锁定两者的成本很小.但在竞争激烈的用例中,它可能成为一个问题.
以上是大佬教程为你收集整理的c – 通过复制和交换与两个锁分配全部内容,希望文章能够帮你解决c – 通过复制和交换与两个锁分配所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。