dll中的多线程

Posted

技术标签:

【中文标题】dll中的多线程【英文标题】:Multithreading in a dll 【发布时间】:2016-07-24 20:16:08 【问题描述】:

我想让两个函数在 dll 中同时在后台运行,所以我在 dllmain 中做了CreateThread,但它不起作用。有什么提示或帮助吗?

#include <Windows.h>
#include "main.h"
#include <iostream>

void main()

AllocConsole();
freopen("CONOUT$", "w", stdout);
std::cout << "Press enter?";
while (true) 
    if (GetAsyncKeyState(0x0D))
        Trainer(); Sleep(50);



BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD Reason, LPVOID Reserved) 
   switch (Reason) 

case DLL_PROCESS_ATTACH:
    MessageBox(0, "DllInject", "Injected", 0);
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)main, NULL, 0, NULL);
    break;

case DLL_PROCESS_DETACH:
    break;


return TRUE;

函数示例

void artemis()

    while (true)
    
        Sleep(300);
        ammoArtemis = 1;
    

【问题讨论】:

不要在DllMain 中创建线程(或做任何实质性的事情,就此而言)。这是死锁的保证。来自the documentation:“由于 DLL 通知是序列化的,因此入口点函数不应尝试与其他线程或进程通信。因此可能会发生死锁。” 另请参阅:Some reasons not to do anything scary in your DllMainp= 40873 会发生什么,您预计会发生什么? 那我应该在哪里创建一个?谢谢。 这取决于你需要什么。完全不清楚您要达到的目标。 抱歉文中出现混乱。我需要两个函数在一个dll中同时运行,不知道怎么实现。 【参考方案1】:

您不应该从 DllMain 调用 CreateThread,因为它可能会导致死锁。您可以从 DllMain 中调用的函数集非常有限。详情请阅读文章Dynamic-Link Library Best Practices。

【讨论】:

【参考方案2】:

在创建线程之前,为您的 DLL 禁用线程通知

DisableThreadLibraryCalls(hinstDll)

这应该有助于解决僵局。

您的线程似乎从名为 ma​​in 的函数开始。但是,线程启动例程需要使用 WINAPI 调用约定,并且应该接受一个参数。

DWORD WINAPI main(PVOID Parameter)

您通过第四个参数提供参数值。

【讨论】:

以上是关于dll中的多线程的主要内容,如果未能解决你的问题,请参考以下文章

VBA中的多线程

boost.python 真正的多线程

dll文件在同一个程序的多线程情况下,是共享的吗?

VB 6 多线程混淆

VB中的多线程

python中的多线程