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 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
void do_something(Action f)
{
   unique_lock 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++为什么不要拿着锁调用未知代码
标题链接:http://myzitong.com/article/gihooe.html