我有两个线程。线程 1 定期挂起线程 2 以收集一些统计信息。线程 1 需要在另一个线程挂起时为这些统计信息分配内存。由于挂起的线程可能持有堆锁,如果线程 1 从同一堆分配内存,则可能会发生死锁。
可能的解决方案:为线程 1 使用私有(private)堆以避免死锁。
如果必须增加私有(private)堆的大小会怎样?必须再次有某种全局锁来同步内存页到堆的分配。所以根据我的理解,如果线程 2 在挂起期间持有这个全局锁,仍然有可能导致死锁。这是正确的还是全局内存管理是通过一些特殊的“无锁原子”机制完成的?
编辑:
线程 2 可能会被 CLR 垃圾收集器或调用 SuspendThread 挂起靠我自己。通过调用 HeapCreate 创建私有(private)堆.
最佳答案
正如 Hans Passant 和 David Heffernan 已经指出的那样,SuspendThread 在众所周知的问题上很麻烦,如果有人能帮助它,那么永远不会挂起线程,但让它阻塞在同步原语上。这样,您就可以提前知道什么时候可以阻塞,什么时候不能阻塞,并且不会在内存分配过程中。
显然这对您的应用程序来说不太可能。
指定每个堆都由单个锁保护以防止多线程访问。因此,按照您的设想使用私有(private)堆听起来像是一个可行的解决方案。 HeapCreate 为指定的最大大小保留地址空间并为初始大小提交内存。此后它并没有真正“增长”,而只是在已经保留的地址空间中提交更多内存。
虽然没有指定堆必须如何精确操作(所以我们只能猜测),但这不是应该能够死锁的东西,因为它可能只是调用 VirtualAlloc(或取决于如何它已实现,它可能只是保护页面上的页面错误,例如堆栈以这种方式提交其内存)。
VirtualAlloc 或虚拟内存/内存映射子系统不能有“更大的锁”(好吧,它们肯定有,但不是用户进程拥有的!)因为如果他们这样做了,您将能够在计算机上轻松地运行拒绝服务攻击,使计算机上的所有其他进程陷入死锁。页面错误一直在发生,因此一旦计算机上的任何进程挂起一个线程,任何进程(即使是那些没有调用VirtualAlloc的进程)都将是安全的。
幸运的是,情况并非如此(这将是一场噩梦!)。
就此而言,您使用私有(private)堆的解决方案可能是一个不错的解决方案。
作为替代解决方案,由于您正在编写分析器并且需要为“统计信息”(使用的 CPU、上下文切换、工作集大小,诸如此类?)分配内存,因此人们可能会认为这或多或少恒定数量的内存,或至少具有可预测上限的内存量。
因此,您可以简单地在之前 挂起另一个线程分配内存。这意味着关于锁的任何问题都无关紧要。
关于windows - 从私有(private)堆分配内存会导致死锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21157044/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal