windows信号量的使用

原创 2013年12月03日 09:49:50

Windows信号量使用

Ø  Windows信号量可以通过以下几个函数实现:

CreateEvent       创建信号量

WaitForSingleObject:    等待特定的信号量

ResetEvent                重置信号量为无信号状态

SetEvent                   设置信号量为有信号状态

²  需要注意的是:

在创建信号量的时候可以指定是否自动恢复信号量,也就是在等待被唤醒后,是否自动将信号量设置为无信号状态。

当设置为自动恢复时,如果信号量被其他线程通过setEvent设置为有信号状态。如果此时没有人等待该信号量,则信号量保持有信号状态,直到第一个等待的人到达并将其设置为无信号状态为止。

如果设置为非自动恢复,此时一定要注意调用ResetEvent来将信号量恢复为无信号状态。否则其他到来的等待都将失败。

 

#include <stdio.h>

#include <process.h>

#include <windows.h>

 

void * Event = NULL;

 

static DWORD WINAPI wait (LPVOID lpParameter)

{

    printf("wait for resume!\n");

    WaitForSingleObject(Event, -1);

    printf("resumed!\n");

    ResetEvent(Event);

    return0;

}

 

static DWORD WINAPI resume (LPVOID lpParameter)

{

    printf("resume thread!\n");

    SetEvent(Event);

    return0;

}

 

int main_1()

{

    HANDLEret;

 

    Event= CreateEvent(NULL,FALSE, FALSE,NULL); //! 第二个参数表示是否手动恢复信号量,TRUE:手动恢复信号量FALSE:自动恢复信号量

 

 

test1:

    ret= _beginthreadex(NULL,0, wait, NULL,0, &ret);     //! 开启线程,等待该信号量

    Sleep(50);

    ret= _beginthreadex(NULL,0, resume, NULL,0, &ret);   //! 开启线程,设置该线程为有信号状态,此时线程继续执行

    Sleep(50);

    ret= _beginthreadex(NULL,0, wait, NULL,0, &ret);     //! 开启线程,等该该信号量。此时如果是自动恢复信号量,则该线程等待成功。否则该线程等待失败。因为在线程的设置的信号量没有被复位

    Sleep(50);

 

test2:

    ret= _beginthreadex(NULL,0, resume, NULL,0, &ret);    //!开启线程,设置信号量为有信号状态

    Sleep(50);

    ret= _beginthreadex(NULL,0, wait, NULL,0, &ret);      //! 开启线程,等待该信号量,此时因为信号量为有信号状态,线程等待失败

    Sleep(50);

    ret= _beginthreadex(NULL,0, wait, NULL,0, &ret);      //! 开启线程,等该该信号量。此时如果是自动恢复信号量,则该线程等待成功。否则该线程等待失败。因为在线程的设置的信号量没有被复位

    Sleep(50);

 

 

    //!结论:信号量的复位是在调用WaitForSingleObject后进行的。也就是说假如在调用SetEvent的时候没有人等待该信号量,此时信号量并不复位。

    //!而是由下一个等待该信号的人复位。这样就保证了有信号状态时总能有人使用该信号。

    //!当创建的event是手动复位时,必须在适当的时候复位,否则会出错

 

    return0;

}

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

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

windows下C的信号量使用

http://www.cnblogs.com/vieri122/archive/2009/09/10/1564104.html 内核事件: 适用范围:多用于线程间的通信,可以跨进程同步。 ...
  • s651665496
  • s651665496
  • 2015年07月22日 16:45
  • 700

windows核心编程-信号量内核对象

信号量内核对象用来对资源进行计数。与其他内核对象不同的是,它还包含了两个32位值:一个最大资源计数和一个当前资源计数。 最大资源表示信号量可以控制的最大资源数量,当前资源计数表示信号量当前可用的资源...
  • qq_22423659
  • qq_22423659
  • 2016年12月07日 15:44
  • 207

windows信号量使用

信号量(Semaphore)内核对象对线程的同步方式与前面几种方法不同,它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。在用CreateSemaphore()创建...
  • wangweitingaabbcc
  • wangweitingaabbcc
  • 2011年09月29日 11:17
  • 17783

windows信号量使用

转载自:http://blog.csdn.net/wangweitingaabbcc/article/details/6833265 信号量(Semaphore)内核对象对线程的同步方式与前面几种方...
  • u012377333
  • u012377333
  • 2015年03月30日 15:06
  • 1568

windows多线程同步机制---信号量

1 信号量     通知的作用,和事件类似.但是与事件不同.事件只维护一个值0或者1.     信号量维护一个变量,0时无信号,大于0有信号.        2 信号量的使用     2.1...
  • rankun1
  • rankun1
  • 2016年02月17日 20:26
  • 474

win32 API的互斥量与信号量

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

使用信号量进行同步的共享内存机制

一、简介 共享内存为在多个进程之间共享和传递数据提供了一种有效的方式。 但它本身并未提供同步机制。 在实际编程中,可以使用   信号量,   传递消息(使用管道或IPC消...
  • qq_33336155
  • qq_33336155
  • 2016年07月11日 15:28
  • 1412

网络编程(40)—— 使用信号量semaphore进行多进程间的同步

本文主要介绍下在多进程中使用信号量semaphore的方法。在上一文中,我们已经知道semaphore和mutex对临界区访问控制的一个最主要区别就是semaphore可以跨进程使用,而mutex只能...
  • lzhui1987
  • lzhui1987
  • 2016年12月18日 14:20
  • 1683

分别在windows和linux下用信号量解决生产者消费者问题

用信号量解决生产者消费者问题                                       实验目的   通过实验,掌握Windows和Linux环境下互斥锁和信号量的实现 方法...
  • yxq_fxd
  • yxq_fxd
  • 2016年05月15日 16:53
  • 714
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows信号量的使用
举报原因:
原因补充:

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