使用超时终止功能

时间:2016-03-01 09:24:23

标签: c++ linux

我有第三方图书馆。该库具有名为int foo()的函数。函数是基于线程的,我无法更改函数的内容。 (它不属于我。)

当我调用该函数时,它会被锁定并且不会返回该值。当函数被锁定时,有没有办法杀死这个基于线程的函数?例如,当函数在5秒内没有返回值时,我希望在没有任何内存泄漏的情况下将其删除。

3 个答案:

答案 0 :(得分:3)

由于它是你无法控制的第三方库,你无法移植终止运行该代码的线程,虽然你可以调用native_handle并使用它的线程终止工具,你很可能会介绍的泄漏

请注意,线程存在于同一个地址空间中,因此一个线程的损坏或泄漏会影响整个程序。

我能想到的选项是生成一个新进程来运行该代码,如果5秒后它还没有完成,你可以请求操作系统杀死它。 {没有内存泄漏和资源被释放} :-) ...你最好的选择...

答案 1 :(得分:2)

StoryTeller建议的一种可能的解决方案是在您控制的另一个线程中调用foo()。发生超时时,您将使线程在后台运行。这意味着foo()继续执行,但您的程序可以继续执行。这种方法是可移植的,因此您不需要编写任何依赖于操作系统的代码。

离开foo()可能会产生不必要的副作用,foo()将继续在后台使用资源,因此您必须测试这是否适用于您的情况。

#include <boost/thread.hpp>
#include <ctime>

void FooWrapper(bool& hasResult, int& result){
    result = foo();
    hasResult = true;
}

void AnotherFunction(){
    bool hasResult = false;
    int result;
    boost::thread(&FooWrapper, boost::ref(hasResult), boost::ref(result));

    // Wait until result, or until timeout
    std::time_t startTime = time(0);   
    while(!hasResult && time(0) < startTime + 5){
        // Do nothing
    }
    if(!hasResult){
        throw "timeout";
    }
    else{   
        // Use result
    }
}

我在这里使用boost线程,但您可以将其转换为使用您想要的任何线程库。

答案 2 :(得分:1)

不,没有内存泄漏就没有办法这样做,因为运行foo的线程可能会分配堆数据,可能会将一些私有数据放入主程序或其他主机所拥有的值中。

请注意,数据活跃性(和virtual address space)是一个完整的程序属性:某些堆数据不属于(特定)线程,而是属于整个进程。该库可以(也可能应该)使用智能指针作为约定