信号量——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顺序输出的情况。

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

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

在Win32环境下编写多线程应用程序,也会常用到信号量Semaphore来进行线程同步。与其相关的一组API包括:CreateSemaphore,ReleaseSemaphore,WaitForSin...
  • chexlong
  • chexlong
  • 2011年12月20日 21:07
  • 3924

windows核心编程-信号量(semaphore)

线程同步的方式主要有:临界区、互斥区、事件、信号量四种方式。 前边讲过了互斥器线程同步-----windows核心编程-互斥器(Mutexes),这章我来介绍一下信号量(semaphore)线程同步。...
  • windows_nt
  • windows_nt
  • 2013年07月24日 22:48
  • 12393

win32 API的互斥量与信号量

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

信号量(二) 经典例子举例(一)

      本文中的PV操作例子都取自上课时老师讲的例题,当中包括“《越狱》寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等 首先,讲 semWait操作(P操作)和se...
  • lengyuhong
  • lengyuhong
  • 2009年11月01日 15:52
  • 4048

信号量机制在WINDOWS编程中的实际应用

  同步问题就是因为线程/进程 间异步执行访问共享数据而引起的数据冲突的问题(经典的例子:生产者与消费者问题),windows提供了一些同步对象来解决此类问题,包括:临界区对象、互斥体对象、事件对象、...
  • liuyongjin1984
  • liuyongjin1984
  • 2008年03月11日 10:18
  • 4285

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

#include "windows.h" #include "stdio.h" #include "conio.h" HANDLE g_hEvent = NULL; HANDLE g_hSem = N...
  • yangshuolll
  • yangshuolll
  • 2015年08月12日 16:19
  • 530

win32练习-信号量

// Semaphore.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "Semaphore.h" #include #include ...
  • AlickXc
  • AlickXc
  • 2015年04月07日 19:18
  • 218

Win32多线程之信号量(Semaphores)

信号量是解决各种生产者/消费者问题的关键要素。这种问题会存在一个缓冲区,可能在同一时间内被读出数据或被写入数据。    Win32中的一个semaphore可以被锁住最多n次,其中n是semapho...
  • wjj715211
  • wjj715211
  • 2013年11月24日 21:45
  • 581

信号量——win32 API函数

一、关于信号量 1、在信号量中有一个内置的计数值,用于对资源进行计数;同时它通过内置的互斥机制保证在有多个线程试图对计数值进行修改时,在任一时刻只有一个线程对计数值进行修改。 2、信号量的两个核心...
  • xringm
  • xringm
  • 2016年03月24日 10:46
  • 266

信号量API用法

信号量操作函数
  • dayancn
  • dayancn
  • 2014年04月11日 10:19
  • 823
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:信号量——win32 API函数
举报原因:
原因补充:

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