我的情况如下:
int funcA()
{
/*There will call funcB*/
funcB();
}
funcB()
也许会持续很长时间。如果我发现它已经运行了超过 5 分钟,我想中止funcB()
并继续做其他事情。
我怎样才能做到这一点?
我的情况如下:
int funcA()
{
/*There will call funcB*/
funcB();
}
funcB()
也许会持续很长时间。如果我发现它已经运行了超过 5 分钟,我想中止funcB()
并继续做其他事情。
我怎样才能做到这一点?
一种方法是测量自进入以来经过的时间, funcB()
例如,如果您在funcB()
. 理想情况下,您的函数返回一个指示成功或提前终止的值,因此funcA()
有办法知道是否funcB()
已完成。
另一种方法是funcB()
在自己的线程中运行。如果您的主线程确定已经过了 5 分钟,它可以终止正在执行的线程funcB()
。
如果您是初学者,为什么不使用fork()
. 然后在新进程内开始计时,如果超过 5 分钟则终止该进程。尽管在大多数情况下线程更好用,但初学者更容易创建新进程。
您应该在 funcB 中编写一个功能,以便它知道返回。如果 funcB 例如写入文件,则其他任何事情都有些不安全。有很多方法可以做到这一点。我假设你在 funcB 中有一个循环,你想中止它。如果你有别的东西,比如阻塞 IO 操作,你必须做一些不同的事情。
如果您有单线程,则可以将中止逻辑直接编码到 funcB 中。您还可以为 funcB 提供函数指针参数,然后在每个循环轮次调用该函数以查看它是否可以中止。这样,您可以更轻松地获得不同的中止条件。
如果您有多个线程,则应使用原子标志变量,当您希望 funcB 中止时从其他线程设置该变量,然后在 funcB 循环中对其进行测试。这是让线程运行循环退出的最常用方法。
补充:如果您要中止文件操作,如果您执行以下操作,则可以安全地执行此操作:
该函数必须写入临时文件(在同一磁盘分区),然后关闭它并使用重命名操作(当文件在同一分区时,在操作系统级别是原子的)来创建/替换最终文件。这样,如果操作被中止,最终文件将不会处于损坏状态。
调用者必须具有临时文件的文件句柄或文件描述符,因此如果文件操作在文件打开时中止,它可以关闭文件。如果文件操作发生在另一个被杀死的进程中,那么这将关闭所有文件句柄,这不是必需的。
调用者还应始终尝试删除临时文件,以防中止的函数/线程/进程没有机会将其重命名为最终名称或将其删除。
补充 2:在 Unix/Linux 中可以使用 alarm() 函数。看到这个:简单的信号 - C 编程和报警功能