滴水2.24 互斥体 内核对象

1

功能说明:
等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止.
hHandle:内核对象句柄,可以是进程也可以是线程.
dwMilliseconds:等待时间,单位是毫秒 INFINITE(-1)一直等待

image
特别说明:

image

WaitForSingleObject
#include<stdio.h>
#include<Windows.h>

int sum = 0;
CRITICAL_SECTION cs;

DWORD WINAPI ThreadProc(
	LPVOID lpParameter   // thread data					
)
{
	int i = 0;
	while (i < 10)
	{
		Sleep(500);
		i++;
	}
	return 0;
}


int main()
{

	InitializeCriticalSection(&cs);

	//创建一个新的线程							
	HANDLE hThread = ::CreateThread(NULL, 0, ThreadProc,
		NULL, 0, NULL);

	//如果不在其他的地方引用它 关闭句柄							
	DWORD dwCode = ::WaitForSingleObject(hThread, INFINITE);
	MessageBox(0, 0, 0, 0);



	

	return 0;
}
2.线程句柄清除 closehandle 函数信息 https://baike.baidu.com/item/CloseHandle/9621618?fr=aladdin 三环堆栈不会清理

会清理掉高2G内存的数据

如果重复写等待函数 可能会造成卡死 因为 对特定的内核对象 该等待函数可能会改变通知状态
2.
image

代码演示
#include<stdio.h>
#include<Windows.h>

int sum = 0;
CRITICAL_SECTION cs;


DWORD WINAPI ThreadProc(
	LPVOID lpParameter   // thread data					
)
{
	int i = 0;
	while (i < 10)
	{
		Sleep(500);
		i++;
	}
	return 0;
}


DWORD WINAPI ThreadProc2(
	LPVOID lpParameter   // thread data					
)
{
	int i = 0;
	while (i < 10)
	{
		Sleep(500);
		i++;
	}
	return 0;
}

int main()
{
	InitializeCriticalSection(&cs);
	HANDLE hThread[2];
	//创建一个新的线程							
	 hThread[0]= ::CreateThread(NULL, 0, ThreadProc,
		NULL, 0, NULL);
	 
	 hThread[1] = ::CreateThread(NULL, 0, ThreadProc2,
		 NULL, 0, NULL);
	
	//如果不在其他的地方引用它 关闭句柄							
	DWORD dwCode = ::WaitForMultipleObjects(2, hThread,TRUE,-1);

	//TRUE 所有线程变成 已通知 放权
	//flase 但凡有一个通知 就放权
	
	MessageBox(0, 0, 0, 0);
	return 0;
}

配合线程结束使用
防止内核对象泄露
3.内核对象 互斥体
临界区--也是线程的互斥
CreateMutex 互斥体的创建
CreateMutex是一个计算机函数,作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。

点击查看代码
HANDLE g_hMutex = CreateMutex(NULL,FALSE, "XYZ");
//创建

//换进程 打开
HANDLE g_hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE, "XYZ");
ReleaseMutex(g_hMutex);
跨进程通信

因为是内核程序 在高两G内存 所以可以跨进程访问
同步 我吃饭等你一起吃 异步 我叫你吃饭 但是不等你

4.什么是内核对象

image
2、事件内核对象的创建
///HANDLE g_hEvent = CreateEvent(NULL, TRUE, FALSE, "XYZ");
HANDLE g_hMutex = CreateMutex(NULL,FALSE, "XYZ");
3.内核对象的获取
HANDLE g_hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "XYZ");
//这里的 g_hMutex g_hEvent都是指针的指针 为了安全考虑
4、内核对象的销毁
BOOL CloseHandle(HANDLE hobj);
(1)、当没有其他程序引用时,系统会销毁内核对象(使用数量).
(2)、内核对象的生命周期,可能比创建它的对象要长.

实验:CloseHandle()/进程结束 查看引用内核对象 的数量 为0才结束

posted @ 2023-02-24 21:20  逆向狗  阅读(49)  评论(0)    收藏  举报