Multithreading 为什么SuspendThread(或任何类似的函数)不安全?
我正在写一个增量gc。当GC搜索线程堆栈时,该线程不得接触其堆栈。但是,使所有访问堆栈关键部分的权限都过于昂贵。。因此,我想在gc搜索其堆栈时挂起线程。但我听说Multithreading 为什么SuspendThread(或任何类似的函数)不安全?,multithreading,garbage-collection,Multithreading,Garbage Collection,我正在写一个增量gc。当GC搜索线程堆栈时,该线程不得接触其堆栈。但是,使所有访问堆栈关键部分的权限都过于昂贵。。因此,我想在gc搜索其堆栈时挂起线程。但我听说SuspendThread(或任何类似的函数)是不安全的。为什么???有一个不可避免的致命问题:如果挂起的线程持有挂起它的线程需要的锁,例如内存分配器上的锁或某个系统库中的锁,该怎么办轰@Dukeling谢谢。我增加了一些细节。嗯。。在这种情况下,在GC完成对一个线程的堆栈的搜索后,GC恢复该线程。没有你在GC里说的锁。因此,在这种情况下
SuspendThread
(或任何类似的函数)是不安全的。为什么???有一个不可避免的致命问题:如果挂起的线程持有挂起它的线程需要的锁,例如内存分配器上的锁或某个系统库中的锁,该怎么办轰@Dukeling谢谢。我增加了一些细节。嗯。。在这种情况下,在GC完成对一个线程的堆栈的搜索后,GC恢复该线程。没有你在GC里说的锁。因此,在这种情况下,我可以使用SuspendThread
?@ikh您的意思是您的垃圾收集器根本不会调用任何系统库?它不会释放任何内存吗?如果你能在线程停止时遵循这些规则,你可能会没事的。。似乎我应该看看我的平台文档,知道GC使用的函数是否锁定。。谢谢大家!@ikh通常认为文件不存在。如果有可用的源代码,您可能必须仔细阅读。相反,用一种明智的方法来做这件事——用它的协作挂起线程。巧妙地要求线程告诉您何时它没有持有任何锁,并让它等待,直到您告诉它继续。GC在哪里运行?