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)
这应该有助于解决僵局。
您的线程似乎从名为 main 的函数开始。但是,线程启动例程需要使用 WINAPI 调用约定,并且应该接受一个参数。
DWORD WINAPI main(PVOID Parameter)
您通过第四个参数提供参数值。
【讨论】:
以上是关于dll中的多线程的主要内容,如果未能解决你的问题,请参考以下文章