gpt4 book ai didi

c++ - 使用 boost::timed_join 和 FreeLibrary 时崩溃

转载 作者:行者123 更新时间:2023-11-30 04:24:53 24 4
gpt4 key购买 nike

我需要使用 LoadLibraryGetProcAddress 从某些 dll(插入我的应用程序)中调用函数,但我不希望它们能够通过包含一个无限循环或挂起自己来挂起我的程序,所以我试图使用 boost::thread (没有经验)来规避它。但是,如果某个函数挂起,我会在调用 FreeLibrary 进行清理时因 ACCESS_DENIED (0x00000005) 而崩溃。

这是重现问题的最小 DLL (mydll.dll):

extern "C" {
void __declspec(dllexport) foo() {
for(;;); //<-- infinite loop
}
}

这是一个崩溃的最小 cpp。为简洁起见,我省略了错误检查,但我可以向您保证没有给出任何错误:

#include <boost/thread.hpp>
#include <iostream>
#include <windows.h>

int main() {
using FuncType = void (*)();

HMODULE dll = LoadLibrary("mydll.dll");

FuncType func = (FuncType)GetProcAddress(dll, "foo");

boost::thread thr = [func] {func();};

if (!thr.timed_join(boost::posix_time::seconds(1))) {
std::cout << "Timed out.";
//thr.detach();
FreeLibrary(dll);
}

for (;;);
}

运行时,“超时”。被打印出来,崩溃时的调用栈(gdb on CodeBlocks)如下:

#0 00000000 0x6c1c1214 in ??() (??:??)
#1 0040133E operator() (__closure=<optimized out>) (C:\...\thread test.cpp:17)
#5 00000000 0x00000000 in ??() (??:??)

如果没有优化,那就变成了:

#0 00000000 0x6c1c1214 in ??() (??:??)
#1 00401348 operator() (__closure=0x898f90) (C:\...\thread test.cpp:17)
#2 00401780 boost::detail::thread_data<main()::<lambda()> >::run(void)(this=0x898f70) (c:/.../boost/thread/detail/thread.hpp:62)
#5 00000000 0x00000000 in ??() (??:??)

我尝试的第一件事是在我在上面注释掉的 thr.detach(); 行中添加,但结果相同。

我也试过以下方法都无济于事:

  • 用一个函数替换 lambda(我不确定 Boost 与 C++11 的配合有多好)--- 崩溃
  • 注释掉 FreeLibrary 行 --- 工作正常,但我宁愿在加载后释放它,即使它是基于引用的。我也对以后的这种行为持谨慎态度。
  • 将 DLL 中的无限循环替换为返回 --- 的无限循环工作正常,但我不能指望它
  • 不使用 LoadLibrary 或任何东西并内联无限循环 --- 工作正常,但我需要使用 DLL:

boost::thread thr = []{for (;;);};

DLL 和 cpp 都是在 Windows 7 64 位上使用 GCC 4.7.1 和 32 位输出类型编译的。我的 Boost 版本是 1.49.0。如果没记错的话,我想在转移到另一台计算机之前,我在 Windows XP 32 位(相同的编译器等)上进行了一两次测试。

为什么会崩溃?如何确保我动态调用的函数不会挂起我的程序?

最佳答案

从根本上说,您不能那样做。线程不提供那种隔离。如果需要,请使用流程。

关于c++ - 使用 boost::timed_join 和 FreeLibrary 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com