信号量——win32 API函数

转载 2011年01月18日 16:07:00

信号量——win32 API函数

(2010-05-31 17:31:51)

一、关于信号量

1、在信号量中有一个内置的计数值,用于对资源进行计数;同时它通过内置的互斥机制保证在有多个线程试图对计数值进行修改时,在任一时刻只有一个线程对计数值进行修改。

2、信号量的两个核心操作是Up操作(提高计数值)和Down操作(降低计数值):

  1)Down操作:

     检查信号量的计数值是否大于零

     1》若大于零,信号量的计数值减一(即用掉了一个信号量计数了),线程继续运行;

     2》若等于零(也就是线程不能获得所需的信号量了),于是进入睡眠状态。

    Down操作的原子性保证了一旦一个线程对信号量的

操作开始,其他线程就不能访问,知道操作完成或阻塞。

  2)Up操作

    用于线程释放对信号量的所有权,提高信号量的计数值。

    若有多个线程正睡眠在该信号量上,则其中一个被操作系统选中,并被允许调用Down操作,此时计数值仍为零。于是睡眠在该信号量上的少了一个。

 

二、有关函数

CreateSemaphore()   创建一个信号量

OpenSemaphore()     打开一个已经创建的信号量

ReleaseSemaphore()  释放对信号量的所有权

 

三、用法

#include<windows.h>
#include<process.h>
#include<iostream.h>
HANDLE hSemaphore;
DWORD WINAPI MyThread(LPVOID lpParameter)
{
 int *pNo=(int*)lpParameter;
 WaitForSingleObject(hSemaphore,INFINITE);//等待信号量
 cout<<"Thread#  "<<*pNo<<"get the Semaphore"<<endl;
 Sleep(1000*(*pNo));
 cout<<"Thread#  "<<*pNo<<"release Semaphore"<<endl;
 ReleaseSemaphore(hSemaphore,1,NULL);//释放对信号量的所有权
 return 1;
}
int main(int argc,char *argv[])
{
 int ThNo[6];
 DWORD dw;
 hSemaphore = CreateSemaphore(NULL,3,3,NULL);//创建信号量 ,最大计数值为3
 for(int i=0;i<6;i++)
 {
  ThNo[i]=i+1;
  CreateThread(NULL,0,MyThread,&ThNo[i],NULL,&dw);//创建线程
 }
 Sleep(6000);//6000毫秒后结束进程
 return 0;
}

这个程序因为利用了Sleep(),让我们明显的观测到信号量的获得和释放。

1、主线程创建了一个信号量,每次只允许3个线程同时获得信号量,于是线程1,2,3获得信号量,其余三个处于睡眠状态。

2、1000毫秒之后,线程1释放信号量,线程4获得

3、2000毫秒之后,线程2释放信号量,线程5获得

4、3000毫秒之后,线程3释放信号量,线程6获得

5、最后6000毫秒的时间到,线程4,5,6分别释放信号量。程序结果运行如下。

信号量鈥斺攚in32 <wbr>API函数

由于竞争的关系,抢到信号量的线程是随机的,所以会出现不一定按1,2,3顺序输出的情况。

从这可以清楚的看到,只有释放了一个线程,才能再获得一个,总之就是在同一个时刻里只能有三个线程能拥有该信号量。

相关文章推荐

win32 API的互斥量与信号量

信号量(Semaphore)和互斥量一样,属于内核对象。它自动执行可用资源查询的测试,如果有可用资源,则可用资源的计数减少,从而避免其它线程请求资源。当该线程释放该资源后,可用资源计数增加,则操作系统...

有关win32信号量和事件在多线程使用的小例子

#include "windows.h" #include "stdio.h" #include "conio.h" HANDLE g_hEvent = NULL; HANDLE g_hSem = N...

【Win32多线程】同步机制(Critical section、Mutexes、Semaphore、Event Object)

线程同步能避免出现“race conditions”(竞争条件)和“data corruption”(数据破坏)的情况。 同步(synchronous)与异步(asynchronous)的定义: ...

多线程死锁问题(this锁和普通锁区别)

需求:写一个多线程死锁程序。 思路:1、创建一个类Test 实现Runnable接口,并把任务封装到run()方法中。 2、任务代码中用到两个同步代码块,并实现任务切换,来实现死锁。 3,或者用...

win32 API的互斥量与信号量

信号量(Semaphore)和互斥量一样,属于内核对象。它自动执行可用资源查询的测试,如果有可用资源,则可用资源的计数减少,从而避免其它线程请求资源。当该线程释放该资源后,可用资源计数增加,则操作系统...

用C++封装Win32信号量,同步线程

在Win32环境下编写多线程应用程序,也会常用到信号量Semaphore来进行线程同步。与其相关的一组API包括:CreateSemaphore,ReleaseSemaphore,WaitForSin...

Win32 线程的创建&信号量临界资源&事件对象

背景: 写了个程序,主要实现的功能为主线程创建两个子线程,之后主线程进入等待事件的循环。子线程1对临界资源cnt的值减2并输出cnt的值。子线程2对cnt的值加1并输出cnt的值,且当cnt为50的...
  • ordeder
  • ordeder
  • 2014年04月28日 15:54
  • 1166

同步事件,信号量,互斥,临界区,线程,线程池C++实现(win32,linux)

/* * @note :同步事件/信号量/互斥/临界区/线程/线程池实现(win32/linux),不支持unicode * @author :Andy.Ro * @email :Qwuloo@qq...

临界段——win32 API函数

临界段——win32 API函数(2010-05-30 10:52:25)转载标签:api函数win32句柄临界段线程it分类:多线程编程一、有关函数:   InitializeCriticalSec...

临界段——win32 API函数

一、有关函数:    InitializeCriticalSection()    创建一个临界段    DeleteCriticalSection()        释放一个临界段 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:信号量——win32 API函数
举报原因:
原因补充:

(最多只允许输入30个字)