jay*_*jay 3 c memory multithreading memory-management
我正在用 c 语言编写一个多线程环境,使用 setjmp() 和 longjmp() 在线程之间切换。
我不确定如何最好地为每个线程分配堆栈空间。这必须在更大规模的线程环境中动态完成,但我想不出一种方法来跟踪线程使用了多少堆栈,以便改变分配的数量。
我可以在堆栈各部分之间预先分配静态空间量,如下所示:
void call_with_cushion (void) {
char space[1000];
space[999] = 1; /* Do not optimize array out of existence */
child();
}
Run Code Online (Sandbox Code Playgroud)
(代码片段来自维基百科http://en.wikipedia.org/wiki/Setjmp.h)
但这似乎不灵活,我只是想知道多线程环境通常如何为每个线程分配内存?
谢谢
通常,分配给线程的最大堆栈空间量在创建线程时是固定的,如果线程超过此限制,结果将是未定义的行为 - 无法将堆栈空间增加到超出该限制。如果幸运的话,堆栈溢出将导致某种堆栈溢出异常或信号(取决于操作系统和线程实现),但不能保证。
如果你试图实现自己的线程库,理想情况下你想要做的是为每个线程的堆栈分配大量的地址空间,并设置VM系统按需在该空间中分配内存,并在发生异常时捕获空间已满。这是大多数操作系统级线程库(如 pthreads 或 win32 线程)所做的事情,但 VM 管理的细节很棘手。
如果你不想搞乱虚拟机的东西,你可以为每个线程堆栈在堆上分配一个比你认为需要的更大的块,然后可以选择探测代码中的堆栈指针以查看其是否关闭到充满(使用比您想象的需要更多的空间)并捕获/中止(如果是这样)。根据您的编译器,可能有一个选项可以让它在您可以使用的每个函数中自动生成堆栈溢出检查。
维基百科页面上的代码很大程度上是一个黑客——它可能有效,但没有做任何检查来确保有足够的堆栈空间,并且依赖于编译器不会对未定义的行为做一些奇怪的事情,从而搞砸事情(例如优化掉未使用的 stack pad space,即使分配也可能会这样做)。