#include "windows.h"
#include <tchar.h>
DWORD WINAPI ThreadFunc(PVOID pvParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
HANDLE hThread;
DWORD dwThreadID;
//主线程为进程创建一个互斥对象
HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
//让进程拥有两个句柄,对相同的内核互斥对象,这样使用计数,此时成为2,一般情况几个进程使用这个内核对象
//则使用计数为几,这里这种技术可以使得同一个进程对于同一个内核对象拥有>1的使用计数,常用于本进程的各个线程的同步
HANDLE hMutex0;
DuplicateHandle(GetCurrentProcess(), hMutex, GetCurrentProcess(), hMutex0, 0, FALSE, DUPLICATE_SAME_ACCESS);
//主线程创建一个副线程,让它使用一个句柄(属于进程的)去访问本进程的互斥对象,通过参数传入hMutex0本进程内核对象的句柄
hThread = CreateThread(NULL, 0, ThreadFunc, (LPVOID)hMutex0, 0, &dwThreadID);
//现在进程拥有了四个内核对象句柄,(三个内核对象,属于内核),两个指向互斥内核对象,一个指向主线程内核对象,一个指向副线程内核对象
/*
main thread code ...
*/
//主线程使用好了内核对象,关之,至于是否释放,得看副线程情形执行的如何,都执行好了时,内核释放对象
CloseHandle(hMutex);
//主线程等待副线程执行成功,由于副线程内核对象由主线程创建,所以由它关之
//(己)主线程内核对象和进程内核对象由内核释放
WaitForSingleObject(hThread, INFINITE);
//副线程执行成功可以关之
CloseHandle(hThread);
return 0;
}
//线程处理函数
DWORD WINAPI ThreadFunc(PVOID pvParam)
{
//拿到hMutex0的值,以便线程处理互斥内核对象,比如结束时候关内核对象,使用计数-1,已达到的同步
//在同一个进程内的多线程的同步,类似系统多进程的同步,但因为内核对象逻辑上属于进程(不同句柄标识,物理上属于内核的)
//所以才需对同个内核对象让进程拥有不同句柄,以便进程内的多个线程使用,达同步的目的
HANDLE hMu = (HANDLE)pvParam;
/*
code for thread ...
*/
//因为线程仍属于本进程,所以closehandle会关闭内核对象,使用计数-1(释放则由内核负责)
//通知主线程副线程执行好了
CloseHandle(hMu);
return 0;
}
#include <tchar.h>
DWORD WINAPI ThreadFunc(PVOID pvParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
HANDLE hThread;
DWORD dwThreadID;
//主线程为进程创建一个互斥对象
HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
//让进程拥有两个句柄,对相同的内核互斥对象,这样使用计数,此时成为2,一般情况几个进程使用这个内核对象
//则使用计数为几,这里这种技术可以使得同一个进程对于同一个内核对象拥有>1的使用计数,常用于本进程的各个线程的同步
HANDLE hMutex0;
DuplicateHandle(GetCurrentProcess(), hMutex, GetCurrentProcess(), hMutex0, 0, FALSE, DUPLICATE_SAME_ACCESS);
//主线程创建一个副线程,让它使用一个句柄(属于进程的)去访问本进程的互斥对象,通过参数传入hMutex0本进程内核对象的句柄
hThread = CreateThread(NULL, 0, ThreadFunc, (LPVOID)hMutex0, 0, &dwThreadID);
//现在进程拥有了四个内核对象句柄,(三个内核对象,属于内核),两个指向互斥内核对象,一个指向主线程内核对象,一个指向副线程内核对象
/*
main thread code ...
*/
//主线程使用好了内核对象,关之,至于是否释放,得看副线程情形执行的如何,都执行好了时,内核释放对象
CloseHandle(hMutex);
//主线程等待副线程执行成功,由于副线程内核对象由主线程创建,所以由它关之
//(己)主线程内核对象和进程内核对象由内核释放
WaitForSingleObject(hThread, INFINITE);
//副线程执行成功可以关之
CloseHandle(hThread);
return 0;
}
//线程处理函数
DWORD WINAPI ThreadFunc(PVOID pvParam)
{
//拿到hMutex0的值,以便线程处理互斥内核对象,比如结束时候关内核对象,使用计数-1,已达到的同步
//在同一个进程内的多线程的同步,类似系统多进程的同步,但因为内核对象逻辑上属于进程(不同句柄标识,物理上属于内核的)
//所以才需对同个内核对象让进程拥有不同句柄,以便进程内的多个线程使用,达同步的目的
HANDLE hMu = (HANDLE)pvParam;
/*
code for thread ...
*/
//因为线程仍属于本进程,所以closehandle会关闭内核对象,使用计数-1(释放则由内核负责)
//通知主线程副线程执行好了
CloseHandle(hMu);
return 0;
}