Windows多线程管理

信号量

CreateSemaphore——创建信号量

createsemaphore函数创建一个已命名或未命名的信号量对象

HANDLE CreateSemaphore(
  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, 
  LONG lInitialCount, 
  LONG lMaximumCount, 
  LPCTSTR lpName 
);

参数
lpSemaphoreAttributes:[IN] 设置为NULL;
lInitialCount:[IN] 指定信号量对象的初始计数,此值必须大于或等于零且小于或等于lMaximumCount。
当信号量的计数大于零时,会发出信号状态;
在信号量为零时,则不会发出信号状态。
每当等待函数释放等待信号量的线程时,计数就会减少一。通过调用ReleaseSemaphore函数将计数增加指定的数量。
lMaximumCount:[IN]指定信号量对象的最大计数。该值必须大于零。
lpName:[IN]指向以空值结尾的字符串的长指针,该字符串指定信号量对象的名称。名称限制为MAX_PATH字符,并且可以包含除反斜杠路径分隔符(\)之外的任何字符。名称比较区分大小写。
如果lpName与现有命名信号对象的名称匹配,则lInitialCount和lMaximumCount参数将被忽略,因为它们已在创建过程中设置。
如果lpName为NULL,则创建没有名称的信号量对象。
使用举例:

	hRequestHandle = CreateSemaphore(NULL, 1, 1, NULL);
	hCorrelationHandle = CreateSemaphore(NULL, 0, 1, NULL);
	hCorrelationDoneHandle = CreateSemaphore(NULL, 1, 1, NULL);

创建三个信号量,请求句柄设置为(1,1),相关句柄设置为(0,1),相关完成句柄设置为(1,1)。
请求句柄和相关完成句柄相同,以请求句柄为例。初始计数设置为1,发出信号状态。每当等待函数释放信号的线程时,计数减1。后续会调用releasesemaphore函数增加计数。
相关句柄初始计数位0,不会发出信号状态。后续通过releasesemaphore函数增加计数。和等待函数waitforsingleboject交替使用。

返回值:如果创建成功,返回值是信号量对象的句柄。

ReleaseSemaphore——释放信号量

ReleaseSemaphore函数将指定的信号量的对象的计数增加指定数量。

BOOL ReleaseSemaphore(
  HANDLE hSemaphore, 
  LONG lReleaseCount, 
  LPLONG lpPreviousCount 
);

hSemaphore:[IN]处理信号量对象,输入CreateSemaphore函数返回的句柄
lReleaseCount:[IN]指定信号量对象的当前计数要增加的数量。该值必须大于零。
如果指定的数量将导致信号量的计数超过创建信号量时指定的最大计数,则计数不会更改,函数将返回FALSE。
lpPreviousCount:指向32位变量的长指针,用于接收信号量的先前计数。如果不需要上一个计数,则此参数可以为NULL。

使用举例:

	ReleaseSemaphore(hRequestHandle, 1, NULL);

返回值:如果函数成功,返回值为非零;如果失败,返回值为零。

WaitForSingleObject

等待一个内核对象变为已通知状态,直到指定的对象处于发信号状态或者超时间隔过去。
该函数需要传递一个内核对象句柄,该句柄标识一个内核对象,如果该内核对象处于未通知状态,则该函数导致线程进入阻塞状态;如果该内核对象处于已通知状态,则该函数立即返回WAIT_OBJECT_0。第二个参数指明了需要等待的时间(毫秒),可以传递INFINITE指明要无限期等待下去,如果第二个参数为0,那么函数就测试同步对象的状态并立即返回。如果等待超时,该函数返回WAIT_TIMEOUT。如果该函数失败,返回WAIT_FAILED。

进程内核对象

  当进程正在运行时,进程内核对象处于未通知状态。当进程停止运行时,就处于已通知状态。可以通过等待进程来检查进程是否仍然运行。

  无成功等待的副作用。

线程内核对象

  当线程正在运行时,线程内核对象处于未通知状态。当线程停止运行时,就处于已通知状态。可以通过等待线程来检查线程是否仍然运行。

  无成功等待的副作用。

信号量内核对象

  信号量用来对资源进行计数。它包含两个32位值,一个表示能够使用的最大资源数量,一个表示当前可用的资源数量。

  信号量的使用规则如下:
  1.   如果当前资源数量大于0,发出信号量信号
    
  2.   如果当前资源数量是0,不发出信号量信号
    
  3.   不允许当前资源数量为负值
    
  4.   当前资源数量不能大于最大信号数量
    

通过CreateSemaphore创建。ReleaseSemaphore来释放资源,从而使当前资源数量增加。

当调用等待函数时,它会检查信号量的当前资源数量。如果它的值大于0,那么计数器减1,调用线程处于可调度状态。如果当前资源是0,则调用函数的线程进入等待状态。当另一个线程对信号量的当前资源通过ReleaseSemaphore进行递增时,系统会记住该等待线程,并将其变为可调度状态。

当有多个资源共访问时,经常使用信号量内核对象。

其成功等待副作用是当前资源数量减1。

DWORD WaitForSingleObject(
  HANDLE hHandle,
  DWORD dwMilliseconds
);

hHandle:[In]对象的句柄
dwMilliseconds:[In]超时间隔(以毫秒为单位)
如果指定了非零值,则函数将等待,直到发出信号通知对象或间隔过去为止。
如果dwMilliseconds为零,则如果未用信号通知对象,则函数不会进入等待状态;否则,函数将进入等待状态
如果dwMilliseconds为INFINITE,则该函数仅在信号通知对象时返回。

参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。
WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回值才执行后面的代码。
返回值:如果函数成功,则返回值指示函数返回的事件。它可以是以下值之一。

返回值返回码/值描述
WAIT_ABANDONED0x00000080L指定的对象是互斥对象,在拥有线程终止之前,拥有互斥对象的线程未释放该互斥对象。互斥对象的所有权授予调用线程,并且互斥状态设置为无信号。如果互斥锁正在保护持久状态信息,则应检查其一致性。
WAIT_OBJECT_00x00000000L指示指定对象的状态。
WAIT_TIMEOUT0x00000102L超时时间间隔过去了,并且对象的状态没有信号。
WAIT_FAILED(DWORD)0xFFFFFFFF该功能失败。要获取扩展的错误信息,请调用GetLastError。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值