零根本逆向工程36

时间:2022-01-04 07:58:46

讲了第二个内查东西,互斥体。前面已经学过一个内查东西,线程。这节讲两个函数,WaitForSingleObject()和WaitForMultipleObjects()。因此这两个函数是按照内查东西的状态来进行操纵的。

2 ForSingleObject() DWORD WaitForSingleObject( HANDLE hHandle, // handle to object DWORD dwMilliseconds // time-out interval );

成果说明:
期待函数可使线程自愿进入期待状态,直到一个特定的内查东西变为已通知状态为止.

hHandle:
内查东西句柄,可以是进程也可以是线程.

dwMilliseconds:
期待时间,单位是毫秒 INFINITE(-1)一直期待

返回值:
WAIT_OBJECT_0(0) 期待东西变为已通知
WAIT_TIMEOUT(0x102) 超时

出格说明:
1、内查东西中的每种东西都可以说是处于已通知或未通知的状态之中
2、这种状态的切换是由Microsoft为每个东西成立的一套法则来决定的
3、当线程正在运行的时候,线程内查东西处于未通知状态
4、当线程终止运行的时候,它就变为已通知状态
5、在内核中就是个BOOL值,运行时FALSE 结束TRUE

代码演示

DWORD WINAPI ThreadProc1(LPVOID lpParameter) { for(int i=0;i<5;i++) { printf("+++++++++\n"); Sleep(1000); } return 0; } int main(int argc, char* argv[]) { //创建一个新的线程 HANDLE hThread1 = ::CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); DWORD dwCode = ::WaitForSingleObject(hThread1, INFINITE); MessageBox(0,0,0,0); return 0; } 3 和WaitForMultipleObjects() DWORD WaitForMultipleObjects( DWORD nCount, // number of handles in array CONST HANDLE *lpHandles, // object-handle array BOOL bWaitAll, // wait option DWORD dwMilliseconds // time-out interval );

成果说明:同时检察若干个内查东西的已通知状态

nCount:要检察内查东西的数量

lpHandles:内查东西数组

bWaitAll:等到类型 TRUE 等到所有变为已通知 FALSE 只要有一个变为已通知

dwMilliseconds:超不时间

INFINITE一直期待

返回值:
bWaitAll为TRUE时,返回WAIT_OBJECT_0(0) 代码所以内查东西都酿成已通知
bWaitAll为FALSE时,返回最先酿成已通知的内查东西在数组中的索引

WAIT_TIMEOUT(0x102)

代码演示:

DWORD WINAPI ThreadProc1(LPVOID lpParameter) { for(int i=0;i<5;i++) { printf("+++++++++\n"); Sleep(1000); } return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { for(int i=0;i<3;i++) { printf("---------\n"); Sleep(1000); } return 0; } int main(int argc, char* argv[]) { HANDLE hArray[2]; //创建一个新的线程 HANDLE hThread1 = ::CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); //创建一个新的线程 HANDLE hThread2 = ::CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL); hArray[0] = hThread1; hArray[1] = hThread2; DWORD dwCode = ::WaitForMultipleObjects(2, hArray,FALSE,INFINITE); MessageBox(0,0,0,0); return 0; } 4 跨进程的线程控制与互斥体

进程一:
HANDLE g_hMutex = CreateMutex(NULL,FALSE, "XYZ");

进程二:
HANDLE g_hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE, "XYZ");
WaitForSingleObject(g_hMutex,INFINITE);

//逻辑代码
ReleaseMutex(g_hMutex);

进程三:
HANDLE g_hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE, "XYZ");
WaitForSingleObject(g_hMutex,INFINITE);

//逻辑代码
ReleaseMutex(g_hMutex);

互斥体与临界区的区别:
1、临界区只能用于单个进程间的线程控制.
2、互斥体可以设定期待超时,但临界区不能.
3、线程不测终结时,Mutex可以制止无限期待.
4、Mutex效率没有临界区高.

5 操练项目

做一个抢红包项目,要求如下

第一步:在第一个文本框中输入一个值,好比1000 第二步:点击抢红包,同时创建3个线程,每个线程循环进行抢红包的操纵,每次抢50 第三步:使用Mutex进行线程控制,,当第一个文本框中的值<50时,强红包线程结束. 出格说明: 1、四个文本框中的值总和应该为1000 2、强红包线程每次延时50毫秒. 3、使用WaitForMultipleObjects监听所有线程,当线程全部结束后 挪用CloseHandle*句柄.