我是靠谱客的博主 务实羊,最近开发中收集的这篇文章主要介绍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:对象句柄

最后

以上就是务实羊为你收集整理的Windows 现程、互斥锁与同步锁的全部内容,希望文章能够帮你解决Windows 现程、互斥锁与同步锁所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部