Windows 现程、互斥锁与同步锁

一、现程创建与释放

1、创建现程

uintptr_t _beginthread( // NATIVE CODE void( __cdecl *start_address )( void * ), unsigned stack_size, void *arglist );
返回值:
    -1:发生错误(可能是创建的现程退出太快)
    0:发成错误(可能是资源不足,如内存)
    >0:成功,返回现程句柄
        HANDLE ThreadID = (HANDLE)uRet;//通过将返回的现程ID强转为HANDLE类型,可以通过WaitForSingleObject函数等待现程结束
参数:
    start_address:现程的执行函数
    stack_size:栈区大小,默认设置0,(太大可能会失败)
    Arglist:现程执行函数的参数列表

 2、现程结束等待

DWORD WaitForSingleObject( [in] HANDLE hHandle, [in] DWORD  dwMilliseconds );
返回值:
    WAIT_ABANDONED(0x00000080L):指定的对象是一个互斥对象,在拥有该互斥对象的线程终止之前,该对象没有被拥有该对象的线程释放。
    WAIT_OBJECT_0(0x00000000L):指定对象的状态被通知。
    WAIT_TIMEOUT(0x00000102L):超时间隔已过,对象的状态为无信号状态。
    WAIT_FAILED((DWORD)0xFFFFFFFF):功能失败。要获取扩展的错误信息,请调用 GetLastError。
参数:
    hHandle:对象句柄
    dwMilliseconds:超时时间(单位ms)
    INFINITE(0xFFFFFFFF):不超时,永久等待
    IGNORE(0x0):不等待,立即返回

二、现程控制

  1. 信号量(互斥量)

        (1)创建

HANDLE CreateMutexA( [in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes, [in] BOOL bInitialOwner, [in, optional] LPCSTR lpName);
返回值:
    NULL:创建失败
    >0:返回信号量句柄
参数:
    lpMutexAttributes:互斥量的描述结构体
    NULL:句柄不能被子进程继承
    bInitialOwner:所属权
    TRUE:创建者拥有所属权
    FALSE:(建议值)创建者不拥有所属权
    lpName:互斥量的描述

        (2)释放

BOOL CloseHandle( [in] HANDLE hObject);
返回值:
    False:失败
    True:成功
参数:
    hObject:对象句柄

        (3)等待信号

DWORD WaitForSingleObject( [in] HANDLE hHandle, [in] DWORD  dwMilliseconds );
返回值:
    WAIT_ABANDONED(0x00000080L):指定的对象是一个互斥对象,在拥有该互斥对象的线程终止之前,该对象没有被拥有该对象的线程释放。
    WAIT_OBJECT_0(0x00000000L):指定对象的状态被通知。
    WAIT_TIMEOUT(0x00000102L):超时间隔已过,对象的状态为无信号状态。
    WAIT_FAILED((DWORD)0xFFFFFFFF):功能失败。要获取扩展的错误信息,请调用 GetLastError。
参数:
    hHandle:对象句柄
    dwMilliseconds:超时时间(单位ms)
    INFINITE(0xFFFFFFFF):不超时,永久等待
    IGNORE(0x0):不等待,立即返回

        (4)释放信号量

BOOL ReleaseMutex( [in] HANDLE hMutex);
返回值:
    False:失败
    True:成功
参数:
    hMutex:对象句柄

2、事件(同步锁)

        (1)创建事件

HANDLE CreateEventA([in, optional] LPSECURITY_ATTRIBUTES lpEventAttributes, [in] BOOL bManualReset, [in] BOOL nitialState, [in, optional] LPCSTR lpName);
返回值:
    NULL:创建失败
    >0:返回信号量句柄
参数:
    lpMutexAttributes:互斥量的描述结构体
    NULL:句柄不能被子进程继承
    bManualReset:如果此参数为TRUE,该函数将创建一个手动重置事件对象,该对象需要使用 ResetEvent函数将事件状态设置为非信号。如果此参数为FALSE,该函数会创建一个自动重置事件对象,并且系统会在单个等待线程被释放后自动将事件状态重置为非信号状态。
    nitialState:初始状态
    False:无信号
    True:事件状态
    lpName:事件句柄描述

        (2)释放

BOOL CloseHandle( [in] HANDLE hObject);
返回值:
    False:失败
    True:成功
参数:
    hObject:对象句柄

        (3)重置事件

BOOL ResetEvent( [in] HANDLE hEvent);
返回值:
    False:失败
    True:成功
参数:
    hEvent:事件句柄

        (4)获取事件

DWORD WaitForSingleObject( [in] HANDLE hHandle, [in] DWORD  dwMilliseconds );
返回值:
    WAIT_ABANDONED(0x00000080L):指定的对象是一个互斥对象,在拥有该互斥对象的线程终止之前,该对象没有被拥有该对象的线程释放。
    WAIT_OBJECT_0(0x00000000L):指定对象的状态被通知。
    WAIT_TIMEOUT(0x00000102L):超时间隔已过,对象的状态为无信号状态。
    WAIT_FAILED((DWORD)0xFFFFFFFF):功能失败。要获取扩展的错误信息,请调用 GetLastError。
参数:
    hHandle:对象句柄
    dwMilliseconds:超时时间(单位ms)
    INFINITE(0xFFFFFFFF):不超时,永久等待
    IGNORE(0x0):不等待,立即返回

        (5)设置事件

BOOL SetEvent( [in] HANDLE hEvent);
返回值:
    False:失败
    True:成功
参数:
    hEvent:对象句柄

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值