- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在研究非垃圾收集环境(如 C 或 C++)中无锁数据结构的各种内存回收策略。
在我的实验中,我已经成功实现了其中一些策略 - 具体来说,基于静态状态的回收 (QSBR) 和基于时代的回收 (EBR)。
我的问题涉及这两种策略之间的主要区别之一。
首先,我知道 QSBR 和 EBR 是如何运作的,并且已经成功实现了这两种策略。 QSBR 和 EBR 实际上非常相似。它们都是延迟回收策略 - 意思是,它们通过简单地延迟实际释放直到可以证明释放内存是安全的来避免释放内存时的竞争条件.对于 QSBR 和 EBR,这是使用全局“纪元计数器”实现的,然后为每个参与线程使用各种线程本地纪元计数器。
QSBR 和 EBR 之间的主要区别在于,使用 QSBR,您基本上可以指示线程何时不对任何共享数据有任何引用。使用 EBR,您可以指示线程何时确实具有对共享数据的引用。因此,在实践中,使用 EBR 的代码最终看起来更像是传统的互斥锁定/解锁临界区,例如:
enter_critical_section();
/* do some cool lock-free stuff */
exit_critical_section();
...而对于 QSBR,它更像是:
/* do some cool lock-free stuff */
quiescent_state(); // this thread is done using shared data
所以他们非常相似。然而,我不太明白的一件关键事情是所有文献如何表明在实践中,QSBR 有一个主要缺点:它需要应用程序级别支持,这意味着它并不真正适合使用在通用库中。
无数期刊文章或图书馆文档中都提到了这一点,例如 http://www.cs.toronto.edu/~tomhart/papers/tomhart_thesis.pdf ,它说:
The fact that QSBR is application-dependent is the fundamental difference between QSBR and EBR. EBR, by definition, detects grace periods at the library level. QSBR, by contrast, requires that the application report quiescent states to the QSBR library. As we show in Section 5.2, this gives QSBR a significant performance advantage over
User-space RCU project 的文档,它使用了 QSBR 的变体,也说了类似的话:
However, each thread must periodically invoke rcu_quiescent_state(), just as in the kernel, where schedule() must be invoked periodically. Each thread that is to execute RCU read-side critical sections must also invoke rcu_register_thread() after thread creation and rcu_unregister_thread() before thread exit. These requirements clearly put a stringent constraint on the overall application design that, for example, prohibit the use of QSBR RCU in most library code, but in return, QSBR provides unmatched performance.
我很难理解为什么会出现这样的问题。我在这里收集到的是,对于 QSBR,应用程序需要指示它何时进入静止状态。但我不明白为什么这在图书馆层面如此难以做到?
提供栈和队列等数据结构的无锁库难道不能简单地表明它在每个操作完成后进入静止状态吗?为什么有所有关于 QSBR 的警告表明它在库代码中使用起来比在应用程序代码中不容易使用?
最佳答案
在 QSBR 中,quiescent_state()
可以在调用线程不持有共享对象引用的任意位置调用。另一方面,在 EBR 中,线程必须访问由 enter_critical_section()
和 exit_critical_section
注释的临界区内的共享对象。
这种差异带来的是:
QSBR 可以胜过 EBR,因为它可以用于不太频繁的同步。是的,正如您所说,QSBR 可以与 EBR 类似的方式使用,但这并不能提供 QSBR 声称的效率。
在复杂的应用程序中,识别静止状态可能很困难。这就是为什么 RCU 使用等基于静态的技术主要限于存在自然静态的特定环境(例如 Linux 内核中的上下文切换)。
关于multithreading - 基于静态状态的回收与基于时代的回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36573370/
我正在构建一个我想要的 FragmentPagerAdapter(带有小图标的那个); 到屏幕中间(水平)的第一个项目 滑动它并使它们向左/向右移动屏幕的五分之一 实现此目标的最佳方法是什么? 这是一
我正在使用 GalleryView 和大约 40 张图片,而且速度很慢,因为没有回收... 任何人都可以向我展示在 getView 方法上对 GalleryView 的基本回收。 public cla
我收到警告 This FragmentManager should be recycled after use with #recycle() 我正在尝试修复它。有什么建议吗? date.setOnC
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 a specific programming problem, a software a
是否可以在 global.asax 中捕获回收事件? 我知道 Application_End 会被触发,但有没有办法知道它是由应用程序池的回收触发的? 谢谢,Lieven Cardoen 又名 Joh
当我第一次启动应用程序时,我以正确的方式获得了抽屉导航。当我向下滚动抽屉时,问题就出现了。元素开始消失,其中一些甚至交换了位置。我试图找出问题所在,但找不到。希望你能帮助我。 我已经使用 getIte
我正在尝试构建一个 Android 应用程序,在其中使用 RecyclerView。 在 RecyclerView 的项目中,我使用一个 TextView 和四个 CheckBox 来选择任何人。 现
回收 IIS7 应用程序池是否会终止任何当前正在执行的请求?还是等待所有请求完成(如排水管停止)? 我不希望回收规则导致我的 WCF 站点出现间歇性错误。 谢谢 最佳答案 不。 By default,
我动态创建 div,并希望通过检查 div 的 ID 以正确的顺序放置新的 div。 创建新数据时,我对数组进行排序并创建一个新的 div 容器。第一次构建 DOM 时,它工作正常,因为我先创建数据,
IIS 中 Web 应用程序的 .net Recycle 的 Java 等价物是什么。 这是在 IIS 之外的 Linux 机器上使用 Java 时的情况。 只是停止和启动应用程序吗? 最佳答案 并非
问题: 假设您的传输速度高达 10 MB/s,那么回收 DatagramPacket 对象(而不是每次发送数据包时创建一个新对象)是否是一个好主意? 故事: 我正在创建一个 LAN 文件同步应用程序,
我已经使用适配器创建了一个 ListView,但唯一的问题是我们使用了不同的布局,因为它是一个消息传递应用程序。我想通过使用 View 回收来提高性能,但不知道如何回收 View 。 是否可以更改 V
我是 Android 初学者,我不明白为什么会这样。 Activity 截图: 一切正常,除非我向下滚动(因此我认为它与回收有关)...所以当我向上滚动并尝试撤消第一篇文章中的投票(红色箭头)时,它认
我在 RecyclerView 中使用 FlexboxLayoutManager,我需要阻止 RV 回收。我尝试将 itemViewCacheSize() 设置为项目总数,但没有帮助。我也尝试将 ma
在我使用 SearchView 搜索项目后尝试从 RecyclerView 中删除项目时遇到问题,而如果我不使用 SearchView 并正常删除该项目,它工作正常。 这是一个示例,我正在删除该项目,
我正在尝试动态更改 RecycleView 中的图像。它将成功更改但是当我滚动 RecycleView ImageView 时将更改 这是我的适配器类代码: public class Recycler
我有一个表格如下 |GroupID | UserID | -------------------- |1 | 1 | |1 | 2 | |1 |
大家好,在我的 Activity 布局中,我使用这个 XML 来获取按钮数组
我有一个动画时钟,目前有内存泄漏。我目前似乎能够将东西放在图像之上,但不能将其取走或必须清除它(除了重新绘制整个时钟以使秒针不在两个不同的位置之外)。 用于清除时钟组件的代码是: for(UIView
我正在尝试创建一个简单的动画,在 JavaFX 2.x 中将圆向左移动一个像素,该动画有效,但每当我尝试第二次启动时,它就不再起作用了。我尝试了几种方法,代码如下: public void handl
我是一名优秀的程序员,十分优秀!