DLL和应用程序之间的互斥共享

时间:2013-09-18 21:07:48

标签: c++ multithreading boost dll mutex

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

可视化:

O = DLL函数完成

T =应用程序功能启动

App Thread:-------------- O ----------------------------- -----

DLL Thread:---------------------- T --------------------- -----

2 个答案:

答案 0 :(得分:3)

几种方法:

  • 首先想到的是将代码放入DLLMain()中,这是在应用程序/ DLL加载时自动执行的。但并非所有事情都可以在这里完成,比如阻止操作或需要加载其他DLL的操作。如果您尝试这种方法,请务必阅读并理解文档。
  • 第二个想法是throw或assert(),因此必须在任何其他函数之前调用init函数,比如WSAStartup()。然后,在创建任何其他线程之前,您必须在main()中调用一次。这是一种简单的方法。它需要手动工作,你不能在全局变量的内部创建线程(这总是很危险),但至少它会告诉你,如果你弄错了,假设assert()方法,释放的开销为零生成。
  • 第三种变体是使用Boost.Thread的One-time Initialization初始化,这似乎可以做你想要的。

答案 1 :(得分:1)

您可以使用命名事件。

首先为应用和DLL创建一个事件:

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

表示完全使用:

SetEvent(myEvent);

等待完成使用:

WaitForSingleObject(myEvent, INFINITE);