- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我总是感到困惑。有人可以解释一下什么Reentrant在不同的上下文中意味着什么?为什么要使用可重入与不可重入?
假设 pthread (posix) 锁定原语,它们是否是可重入的?使用时应避免哪些陷阱?
互斥体是可重入的吗?
最佳答案
可重入锁定
可重入锁是一种进程可以多次声明锁而不会阻塞自身的锁。在不容易跟踪您是否已经获取锁的情况下,它非常有用。如果锁是不可重入的,您可以抓取该锁,然后在再次抓取它时阻塞,从而有效地使您自己的进程陷入死锁。
重入性通常是代码的一个属性,它没有中央可变状态,如果代码在执行时被调用,则该状态可能会被破坏。这样的调用可以由另一个线程进行,也可以通过源自代码本身的执行路径递归地进行。
如果代码依赖于可以在执行过程中更新的共享状态,则它是不可重入的,至少在更新可能会破坏它的情况下是不可重入的。
可重入锁定的用例
可重入锁应用程序的(有点通用和人为的)示例可能是:
您有一些涉及遍历图(可能其中有循环)的算法的计算。由于循环或由于到同一节点的多个路径,遍历可能会多次访问同一节点。
数据结构受到并发访问的影响,并且可能由于某种原因(可能由另一个线程)进行更新。您需要能够锁定各个节点以处理由于竞争条件而导致的潜在数据损坏。由于某种原因(也许是性能),您不想全局锁定整个数据结构。
您的计算无法保留有关您访问过的节点的完整信息,或者您使用的数据结构不允许快速回答“我以前来过这里吗”问题。
这种情况的一个例子是 Dijkstra 算法的简单实现,其中优先级队列实现为二叉堆,或者使用简单链表作为队列进行广度优先搜索。在这些情况下,扫描队列中现有插入的时间复杂度为 O(N),您可能不想在每次迭代时都执行此操作。
在这种情况下,跟踪您已经获取的锁的成本很高。假设您想在节点级别进行锁定,可重入锁定机制可以减轻判断您之前是否访问过节点的需要。您可以盲目锁定节点,也许在将其从队列中弹出后解锁它。
可重入互斥体
简单的互斥体是不可重入的,因为在给定时间只有一个线程可以位于临界区中。如果您获取互斥锁,然后尝试再次获取它,则简单的互斥锁没有足够的信息来判断谁先前持有它。要递归地执行此操作,您需要一种机制,其中每个线程都有一个 token ,以便您可以知道谁获取了互斥体。这使得互斥机制更加昂贵,因此您可能不想在所有情况下都这样做。
IIRC POSIX 线程 API 确实提供了可重入和不可重入互斥体的选项。
关于multithreading - 可重入锁和一般概念是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1312259/
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我正在开发一个 Android 应用程序。在此应用程序中, Logo 栏显示在所有页面( Activity )上,或者我们可以说它在所有页面上都有标题。这个 Logo 栏有几个图标,如主页、登录、通知
我正在使用 hadoop 使用开源接口(interface) HVPI 处理视频。然而,inputsplit 的实现,更准确地说是在 isSplitableobContext (context, Pa
1. 是什么? MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System
有没有办法使用 c++20s 的概念来检查一个值是否满足某些要求? 假设我正在编写某种使用分页的容器,并且我想让页面大小成为模板参数。 template class container; 我可以使用带
如何在 ArrayList 中循环遍历 ArrayList? 例如,如果我有一个名为 Plants of Plant 对象的 ArrayList。每个 Plant 对象内部都有一个随机数量的花名。我如
如何在UML类图中绘制C++概念? 具体来说,我有以下代码: template concept Printable = requires(T a, std::ostream &where) {
我有兴趣制作一个网站,在访问者访问时闪现整个网络历史记录。我计划使用 JavaScript 来获取每个观看者计算机上的历史记录,并根据他们拥有的内容以不同的速度对其进行动画处理。我的想法是使用 his
有一个模板定义,例如: template void foo( void ) { /* ... */ } 如何定义一个概念,以便N必须为非零正值(N> = 1)? 就像是: template con
封装是信息隐藏还是导致信息隐藏? 正如我们所说,封装将数据和函数绑定(bind)在单个实体中,因此它为我们提供了对数据流的控制,并且我们只能通过一些定义良好的函数来访问实体的数据。因此,当我们说封装导
下面有一个简单的代码片段,它使用以下方式进行编译: g++-9 -std=c++2a -fconcepts 这是试图定义一个需要存在函数的概念。我希望输出是"is",但事实并非如此……知道为什么吗?谢
我有一个普通二元运算符的概念 template concept is_binary_operation = requires (const T& t1, const T& t2) // e.g
我正在c++ 20中实现具有启发式功能的搜索算法。 我试图用类似这样的概念来约束我的算法可以使用的功能: template concept Heuristic = requires(SelfType
我需要了解 SAS 如何读取/执行数据步骤。当我查找有关 SAS 如何读取数据步骤的信息时,我似乎只找到有关它如何读取以进行合并的信息,我不了解与常规数据步骤相关的信息。比方说,我有这行代码: dat
最近我看到一个关于“框架”的问题,如果“框架”有不同的类型或概念。那么,存在不同“类型”的“框架”吗? 例如:NodeJS 是一种“类型”(概念),而 Hibernate ORM 是另一种“类型”(概
如何使用任何技术禁用或清除客户端浏览器 Cookie 我认为使用 javascript 可以用于任何技术 最佳答案 var cookies = document.cookie.split(";");
我正在使用 target = "_blank" 单击链接时生成新选项卡。但是,浏览器会将焦点移至该选项卡。 有没有办法让焦点保持在当前标签页上? 回答摘要 基本上,只需发送一个模拟控件点击的当前事件。
我正在尝试在我的 android/firebase(cloud firestore) 应用程序上添加一项需要其他用户批准/拒绝的功能。例如,当 Air&BnB 上的用户想要预订一个地方时,所有者必须批
这个问题在这里已经有了答案: mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... expec
public class MyClass { public static void main(String[] args) { System.out.println("Hell
我是一名优秀的程序员,十分优秀!