在取消分配资源之前捕获main函数的返回

时间:2010-05-18 21:22:19

标签: multithreading linux-kernel

我正在尝试在Linux内核2.4中实现用户线程,并且遇到了一些有问题和意外的问题。

背景:线程基本上执行单个函数并死掉,除了当我第一次调用thread_create时它必须将main()转换为一个线程(默认情况下它不是一个线程,直到第一次调用,也是在分配所有相关数据结构时)。

由于一个线程执行一个函数而死掉,我们不需要随意“返回”它,但是我们确实需要保存返回值以便稍后用thread_join进行回收,所以我想到的黑客是:当我分配线程堆栈时,我放置一个指向thread_return_handler函数的返回地址,该函数解除分配线程,使其成为僵尸,并保存其返回值以供日后使用。 这适用于“只运行一个函数并且死掉”线程,但主线程非常有问题。因为它实际上是主函数,如果它在其他线程完成之前返回,则正常返回机制启动,并释放所有共享资源,从而搞砸了所有正在运行的线程。

我需要阻止它这样做。关于如何做到的任何想法?

1 个答案:

答案 0 :(得分:1)

您可以注册一个在程序终止时调用的atexit()函数。请注意,您无法区分调用exit()和从main()返回。

......这就是事情的核心。传统上,从main()返回与调用exit()相同,这意味着它表示应终止整个进程 - 包括所有仍在运行的线程。换句话说,“主线程”是特殊的。你确定你不能只记录预期的行为吗?毕竟,这是其他UNIX线程模型的工作方式。