C++为什么不要拿着锁调用未知代码

本篇内容主要讲解“C++为什么不要拿着锁调用未知代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++为什么不要拿着锁调用未知代码”吧!

创新互联建站-专业网站定制、快速模板网站建设、高性价比平顺网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式平顺网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖平顺地区。费用合理售后完善,十载实体公司更值得信赖。

CP.22:永远不要拿着锁调用未知代码(例如callback)

Reason(原因)

If you don't know what a piece of code does, you are risking deadlock.

如果你不知道一段代码会做什么,就会面临死锁的风险。

Example(实例)

void do_this(Foo* p)
{
   lock_guard<mutex> lck {my_mutex};
   // ... do something ...
   p->act(my_data);
   // ...
}

如果你不知道Foo::act会做什么(可能这是一个虚函数,会调用某个派生类的成员),它也可能(递归)调用do_this并引发my_mutex发生死锁。它也可能对另外的mutex加锁并无法在合理的时间内返回,从而导致所有调用do_this的代码发生延迟。

Example(示例)

调用未知代码引起问题的常见例子是调用的函数试图重新访问一个处于锁定状态的对象。这样的问题通常可以通过使用可重入的recursive_mutex解决。例如:

recursive_mutex my_mutex;

template<typename Action>
void do_something(Action f)
{
   unique_lock<recursive_mutex> lck {my_mutex};
   // ... do something ...
   f(this);    // f will do something to *this
   // ...
}

If, as it is likely, f() invokes operations on *this, we must make sure that the object's invariant holds before the call.

如果,由于f()可能调用针对*this的操作,我们必须保证调用之前的对象不变式能够维持。

Enforcement(实施建议)

  • Flag calling a virtual function with a non-recursive mutex held

  • 标记调用一个持有不可重入mutex的虚函数的情况。

  • Flag calling a callback with a non-recursive mutex held

  • 标记调用一个持有不可重入mutex的回调函数的情况。

到此,相信大家对“C++为什么不要拿着锁调用未知代码”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

网站栏目:C++为什么不要拿着锁调用未知代码
本文URL:https://www.cdcxhl.com/article4/gihooe.html

成都网站建设公司_创新互联,为您提供虚拟主机全网营销推广品牌网站设计标签优化定制开发网站导航

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发