我有第三方库。该库的函数名称为int foo()
。函数是基于线程的,我不能更改函数的内容。 (它不属于我)超时终止函数
当我调用该函数时,它变为锁定并且不返回该值。当函数被锁定时,有没有办法杀死这个基于线程的函数?例如,当函数在5秒内没有返回值时,我想杀掉它而没有任何内存泄漏。
我有第三方库。该库的函数名称为int foo()
。函数是基于线程的,我不能更改函数的内容。 (它不属于我)超时终止函数
当我调用该函数时,它变为锁定并且不返回该值。当函数被锁定时,有没有办法杀死这个基于线程的函数?例如,当函数在5秒内没有返回值时,我想杀掉它而没有任何内存泄漏。
自从你无法控制的第三方库,你不能可移植终止运行的代码,虽然你可以呼吁native_handle
和使用它的线程终止设施线程,你将最有可能引进泄漏 。
请注意,线程生活在相同的地址空间,因此一个线程的损坏或泄漏会影响您的整个程序。
我能想到的选项是产生一个新的进程来运行该代码,如果5秒后它没有完成,你可以请求操作系统杀死它。 {没有内存泄漏和资源被释放} :-) ...您的最佳选择...
不,没有内存泄漏,没有办法这样做,因为运行foo
的线程可能会分配堆数据,可能会将某些私有数据放入您的主程序或其他某个拥有的值中。
注意数据活性(和virtual address space)是一个整体程序属性:一些堆数据不属于(特定)线程,而是属于整个进程。图书馆可能(也可能应该)使用智能指针作为约定。
只是想在这里,不知道这是否会工作。但是,你可以覆盖新的运营商? – Neijwiert
@Neijwiert,如果第三方库单独构建,它将无济于事。 – StoryTeller
@StoryTeller它依赖于平台。通常应该在Posixy系统上工作,但不能在Windows上工作。 –
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线程,但你可以将它转换为使用任何你想要的线程库。
感谢您的回答,但运行和使用资源。我的问题涉及内存泄漏并释放资源。 –
@MelihAltıntaş用这种方法,没有内存泄漏,假设foo最终会返回。例如,如果执行foo需要30秒,即使您的超时时间为5秒,资源也会在30秒后释放。当然,如果你想在timeout_之后立即释放这些资源,那么这个解决方案将不起作用。 –
您可以随时在另一个线程上启动该功能。 – StoryTeller
@StoryTeller是的,但是放弃线程可能会导致内存泄漏,因为您不知道正在执行的代码在哪里。 – Neijwiert
@Neijwiert,OP创建的额外线程在超时后不需要终止。我知道这里有一个微妙的资源问题。 – StoryTeller