我有第三方图书馆。该库具有名为int foo()
的函数。函数是基于线程的,我无法更改函数的内容。 (它不属于我。)
当我调用该函数时,它会被锁定并且不会返回该值。当函数被锁定时,有没有办法杀死这个基于线程的函数?例如,当函数在5秒内没有返回值时,我希望在没有任何内存泄漏的情况下将其删除。
答案 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)是一个完整的程序属性:某些堆数据不属于(特定)线程,而是属于整个进程。该库可以(也可能应该)使用智能指针作为约定。