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;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

基于visual c++之windows核心编程代码分析(12)使用信号量同步线程

我们编写多线程应用程序的时候,经常需要进行线程同步协作,我们来实践一下用信号量同步线程。请见代码实现与注释分析,/* 头文件 */ #include #include /* 常量定义 */ #de...

windows信号量使用

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

使用信号量 进行windows线程同步 (Semaphore)

信号量类似于事件,采用通知的方式是两个线程彼此同步,信号量是一个整数,信号量是通过减的方式来操作的,每使用WaitForSingleObjecst等候一次,信号量减一,等到信号量为0时,线程阻塞.Re...

Windows IPC 应用程序移植到 Linux,第 2 部分: 信号量和事件

内容 同步 信号量 事件 简介: 随着开发人员将一些普及的 Windows® 应用程序迁移到 Linux™ 平台,企业中正在进行的向开放源码迁移的浪潮有可能引发极大的移植问...

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

用信号量解决生产者消费者问题                       ...

windows C++ 用信号量控制线程

windows C++ 用信号量控制线程 2010-08-11 09:09 很好的控制线程,让线程互斥,互相协调工作,共享数据,这个问题有很多种解决办法,不过我个人觉得使用信号量控制线程特...

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

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

Windows编程基础 第十五章 线程局部存储 线程同步 原子锁 临界区 事件 互斥量 信号量 可等候定时器

//TLS线程局部存储的函数实现 // #include "stdafx.h" #include "windows.h" #include "tchar.h" #include "locale.h" ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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