本文主要讲解“C为什么不用锁调用未知代码”,感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖学会“C为什么不用锁调用未知代码”!
CP.22:永远不要拿着锁调用未知代码(例如callback)
Reason(原因)
如果你不知道一段代码是做什么的,你就有陷入死锁的风险。
如果你不知道一段代码会做什么,你将面临死锁的风险。
Example(实例)
void do_this(Foo* p)
{
lock _ guard mutex lck { my _ mutex };
//.做某事.
p-act(my _ data);
//.
}如果你不知道Foo:act会做什么(可能这是一个会调用派生类成员的虚函数),它也可能(递归)调用do_this,导致my_mutex死锁。它还可能锁定另一个互斥体,并且无法在合理的时间内返回它,从而导致调用do_this的所有代码的延迟。
Example(示例)
调用未知代码导致的问题的一个常见例子是,被调用的函数试图在锁定状态下重新访问对象。这个问题通常可以通过使用可重入递归互斥来解决。示例:
递归_ mutex my _ mutex
模板类型名称操作
做某事(行动f)
{
unique _递归_ mutex lck { my _ mutex };
//.做某事.
f(这个);//f将对此做一些事情
//.
}如果f()调用了*this上的操作,我们必须确保对象的不变量在调用之前保持不变。
如果,因为f()可能针对*这个调用操作,我们必须确保在调用之前对象是不变量的。
Enforcement(实施建议)
用非递归函数调用虚函数的标志
标记调用包含不可重入互斥体的虚拟函数的情况。
用非递归函数调用回调的标志
标记调用持有不可重入互斥锁的回调函数的情况。
至此,相信大家对“C为什么不用锁调用未知代码”有了更深的理解,那么就让我们在实践中去做吧!这是网站。更多相关内容,可以去相关渠道查询,关注我们,继续学习!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/116967.html