复制对象句柄

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值