如何在C中退出长时间运行的功能?

时间:2013-01-06 03:41:24

标签: c multitasking

我的情况如下:

int funcA()
{
   /*There will call  funcB*/
   funcB();
}

funcB()可能持续很长时间。如果我发现它已运行超过5分钟,我想中止funcB()并继续做其他事情。

我该怎么做?

3 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是测量自进入以来 funcB()内所经过的时间如果你在funcB()中有一个循环。理想情况下,您的函数会返回一个表示成功或提前终止的值,因此funcA()可以知道funcB()是否已完成。

另一种方法是在自己的线程中运行funcB()。如果您的主线程确定已经过了5分钟,它可以终止正在执行funcB()的线程。

答案 1 :(得分:0)

如果您是初学者,为什么不使用fork()创建新流程。然后在新过程中开始计时,如果超过5分钟则终止该过程。尽管在大多数情况下线程更易于使用,但初学者更容易创建新流程。

答案 2 :(得分:0)

您应该在funcB中编写一个功能,以便它知道返回..如果funcB例如写入文件,则其他任何内容都有些不安全。有很多方法可以做到这一点。我假设你在funcB中有一个循环,你要中止。如果您还有其他内容,例如阻止IO操作,则必须以不同的方式执行此操作。

如果你有单线程,你可以将中止逻辑直接编码到funcB中。您还可以为funcB提供函数指针参数,然后每次循环调用该函数以查看它是否可以中止。这样你就可以更容易地拥有不同的中止条件。

如果你有多个线程,你应该使用一个原子标志变量,当你想要funcB中止时你可以从其他线程设置它,然后在funcB循环中测试它。这是twll orher线程运行循环退出的最常用方法。

补充:如果您要中止文件操作,如果您做了一些事情,可以安全地执行此操作:

  1. 该函数必须写入临时文件(在同一磁盘分区),然后关闭它并使用重命名操作(当文件在同一分区时在操作系统级别是原子的)来创建/替换最终文件。这样,如果操作中止,最终文件将不会处于损坏状态。

  2. 调用者必须具有临时文件的文件句柄或文件描述符,因此如果文件操作在文件打开时中止,它可以关闭文件。如果文件操作在另一个被杀死的进程中发生,那么这将关闭所有文件句柄,这是不需要的。

  3. 如果中止的函数/线程/进程没有机会将其重命名为最终名称或将其删除,调用者也应该总是尝试删除临时文件。

  4. 增加2:在Unix / Linux中你可以使用alarm()函数。请参阅:Simple Signals - C programming and alarm function