2016-03-01 43 views
1

我有第三方库。该库的函数名称为int foo()。函数是基于线程的,我不能更改函数的内容。 (它不属于我)超时终止函数

当我调用该函数时,它变为锁定并且不返回该值。当函数被锁定时,有没有办法杀死这个基于线程的函数?例如,当函数在5秒内没有返回值时,我想杀掉它而没有任何内存泄漏。

+0

您可以随时在另一个线程上启动该功能。 – StoryTeller

+0

@StoryTeller是的,但是放弃线程可能会导致内存泄漏,因为您不知道正在执行的代码在哪里。 – Neijwiert

+1

@Neijwiert,OP创建的额外线程在超时后不需要终止。我知道这里有一个微妙的资源问题。 – StoryTeller

回答

3

自从你无法控制的第三方库,你不能可移植终止运行的代码,虽然你可以呼吁native_handle和使用它的线程终止设施线程,你将最有可能引进泄漏

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

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

1

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

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

+0

只是想在这里,不知道这是否会工作。但是,你可以覆盖新的运营商? – Neijwiert

+1

@Neijwiert,如果第三方库单独构建,它将无济于事。 – StoryTeller

+1

@StoryTeller它依赖于平台。通常应该在Posixy系统上工作,但不能在Windows上工作。 –

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线程,但你可以将它转换为使用任何你想要的线程库。

+0

感谢您的回答,但运行和使用资源。我的问题涉及内存泄漏并释放资源。 –

+0

@MelihAltıntaş用这种方法,没有内存泄漏,假设foo最终会返回。例如,如果执行foo需要30秒,即使您的超时时间为5秒,资源也会在30秒后释放。当然,如果你想在timeout_之后立即释放这些资源,那么这个解决方案将不起作用。 –