c++多线程重点难点(四)semaphore
来源:互联网 发布:三拼域名 不值钱 编辑:程序博客网 时间:2024/06/06 02:35
信号量可以实现线程间的同步,使用非常广泛
信号量常用的三个函数:
创建信号量:CreateSemaphore
开启信号量:OpenSemaphore
增加信号量:ReleaseSemaphore
由于信号量是内核对象,因此使用CloseHandle()就可以完成清理与销毁了。
信号量的实现代码:
#include <stdio.h>#include <process.h>#include <windows.h>long g_nNum;unsigned int __stdcall Fun(void *pPM);const int THREAD_NUM = 10;//信号量与关键段HANDLE g_hThreadParameter;CRITICAL_SECTION g_csThreadCode;int main(){ printf(" 经典线程同步 信号量Semaphore\n"); printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n"); //初始化信号量和关键段 g_hThreadParameter = CreateSemaphore(NULL, 0, 1, NULL);//当前0个资源,最大允许1个同时访问 InitializeCriticalSection(&g_csThreadCode); HANDLE handle[THREAD_NUM]; g_nNum = 0; int i = 0; while (i < THREAD_NUM) { handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL); WaitForSingleObject(g_hThreadParameter, INFINITE);//等待信号量>0 ++i; } WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); //销毁信号量和关键段 DeleteCriticalSection(&g_csThreadCode); CloseHandle(g_hThreadParameter); for (i = 0; i < THREAD_NUM; i++) CloseHandle(handle[i]); return 0;}unsigned int __stdcall Fun(void *pPM){ int nThreadNum = *(int *)pPM; ReleaseSemaphore(g_hThreadParameter, 1, NULL);//信号量++ Sleep(50);//some work should to do EnterCriticalSection(&g_csThreadCode); ++g_nNum; Sleep(0);//some work should to do printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum); LeaveCriticalSection(&g_csThreadCode); return 0;}
代码源地址:http://blog.csdn.net/morewindows/article/details/7481609
msdn实现地址:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686946(v=vs.85).aspx
阅读全文
0 0
- c++多线程重点难点(四)semaphore
- 多线程(C++)同步Semaphore
- 多线程(C++)同步Semaphore
- C++多线程重点难点(二)理解
- c++多线程重点难点(三)Mutex
- c++多线程重点难点(五)Event
- Java5 多线程(四)--Semaphore实现信号灯
- Java5 多线程(四)--Semaphore实现信号灯
- c++多线程重点难点(一)interlocked系列原子操作
- c++多线程重点难点(六)CriticalSection
- c# 多线程 --Semaphore(信号量)
- C语言多线程同步 -- 信号量semaphore.h
- 关于Java多线程和并发运行的学习(四)——之Semaphore
- Java多线程之concurrent包(四)——Semaphore信号量
- 多线程-Semaphore
- windows 多线程 (六) 信号量Semaphore
- 多线程同步-信号量(深入理解Semaphore)
- Java多线程工具之Semaphore(信号量)
- 机器学习常用算法二:神经网络
- java学习笔记
- 如何安装centos系统,并且使用xshell进行简单静态ip设置
- bzoj 1688: [Usaco2005 Open]Disease Manangement 疾病管理(状压)
- 存储过程,函数,触发器
- c++多线程重点难点(四)semaphore
- windos nginx curl 超时
- Ruby之map、each、collect、map!、collect!揭秘
- 种子生长相关算法实现
- HALCON里几种数据类型详解
- 虚拟机安装Linux
- sql 计算两经纬度之间的距离
- spring boot整合RabbitMQ(Topic模式)
- 接口开发 face++人脸检测