1

我有一个使用我创建的 DLL 的多线程应用程序。如果 DLL 尚未运行某个函数,则某个函数将失败。如何确保运行此应用程序函数的线程在继续之前等待该 DLL 函数完成?

可视化:

O = DLL 函数完成

T = 应用程序功能启动

应用程序线程:-------------O-------------------------------- --

DLL 线程:----------T------------ --

4

2 回答 2

3

几种方法:

  • 首先想到的是将代码放入 DLLMain(),它会在应用程序/DLL 加载时自动执行。但并非所有事情都可以在这里完成,例如阻塞操作或需要加载其他 DLL 的操作。如果您尝试这种方法,请务必阅读并理解文档。
  • 第二个想法是 throw 或 assert(),因此必须在调用任何其他函数之前调用 init 函数,例如 WSAStartup()。然后,您必须在 main() 中调用一次,然后再创建任何其他线程。这是一种简单的方法。它需要手动工作,并且您不能在全局变量的 ctor 中创建线程(无论如何这总是很危险),但至少它会告诉您是否弄错了,并且假设 assert() 方法的发布开销为零构建。
  • 第三种变体是使用 Boost.Thread 的一次性初始化初始化,这似乎可以满足您的需求。
于 2013-09-19T06:24:00.457 回答
1

您可以使用命名事件。

为应用程序和 DLL 创建一个事件以首先共享:

HANDLE myEvent = CreateEvent(NULL, false, false, L"MyEvent");

发出完成使用的信号:

SetEvent(myEvent);

等待完成使用:

WaitForSingleObject(myEvent, INFINITE);
于 2013-09-18T21:27:42.603 回答