【问题标题】:Mutex sharing between DLL and applicationDLL 和应用程序之间的互斥体共享
【发布时间】:2013-09-18 21:07:47
【问题描述】:

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

可视化:

O = DLL 函数完成

T = 应用程序功能启动

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

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

【问题讨论】:

  • 这是一个牙仙问题。如“编译器或操作系统不能为我处理这个问题”。嗯,是。它需要你的一颗牙齿。

标签: c++ multithreading boost dll mutex


【解决方案1】:

几种方法:

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

【讨论】:

    【解决方案2】:

    您可以使用命名事件。

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

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

    表示完全使用:

    SetEvent(myEvent);
    

    等待完成使用:

    WaitForSingleObject(myEvent, INFINITE);
    

    【讨论】:

    • App 和 DLL 都应该在启动时调用一次CreateEvent(),并在需要时重用同一个句柄。不要在每次需要等待时(重新)创建事件。想想如果 DLL 在应用程序创建事件之前创建、发出信号并关闭事件会发生什么 - 应用程序等待时会发生死锁,因为从未发出过新事件的信号。两个模块都需要为同一事件创建句柄并同时处于活动状态,才能使同步正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多