关键段 互斥量 以及信号量
关键段(主要是用户模式下的线程同步,但是竞争激烈的情况下会进入内核态)
一般是EnterCriticalSection和LeaveCriticalScetion配对使用,需要先创建一个CRITICAL_SECTION结构。
下面的函数用来进行初始化
void InitializerCriticalSection(PCRITICAL_SECTION pcs);
当线程不在需要访问共享资源的时候,应该调用下面的函数来清理结构
void deleteCriticalSection(PCRITICAL_SECTION pcs);
TryEnterCriticalSection从来不会让调用线程进入等待状态,他会通过返回值来表示调用线程是否获准访问资源,因此如果TryEnterCriticalSection发现资源正在被其他线程访问,那么它会返回false。每一个返回true的TryEnterCriticalSection调用必须有一个对应的LeaveCriticalSection。
互斥量
要使用互斥量,进程必须先调用CreateMutexl来插件创建一个互斥量
HANDLE CreateMutex( PSECURITY_ATTRIBUTES psa, BOOL bInitialOwner, PCTSTR pszName);
bInitialOwner用来控制互斥量的初始状态。如果传入false,那么表示互斥量不属于任何线程。
线程ID和递归计数都为0。此时互斥量处于触发状态。如果为true,互斥量的线程ID将被设为主调线程的线程ID,递归计数被设为1。
OpenMutex来打开一个已存在的互斥量。
HANDLE OpenMutex( DWORD dwDesiredAccess, BOOL bInheritHandle, PCTSTR pszName);
使用WaitForSingleObject和ReleaseMutex配合使用,不需要的时候调用closehandle来释放该句柄
信号量
与其他所有内核对象相同,它们也包含一个使用计数,但是它们还包括另外两个32bit值,一个最大资源计数和一个当前资源计数。最大资源计数表示信号量可以控制的最大资源数量,当前资源计数表示信号量当前可用资源的数量。
信号量的规则如下:
1.如果当前资源计数大于0,那么信号量处于触发状态
2.如果当前资源计数等于0,那么信号量处于未触发状态
3.系统绝对不会让当前资源计数变为负数
4.当前资源计数绝对不会大于最大资源计数
创建信号量内核对象:
HANDLE CreateSomaphore( PSECURITY_ATTRIBUTE psa, LONG lInitialCount, LONG lMaximuCount, PCTSTR pszName);
lMaximumCount告诉系统应用程序能够处理的资源最大数量。
lInitialCount表示这些资源一开始有多少可供使用。
任何进程都可以调用OpenSemaphore来得到一个已经存在的信号量的句柄
HANDLE OpenSemaphore( DWORD dwDesiredAccess, BOOL hInheritHandle, PCTSTR pszName);
线程通过调用ReleaseSemaphore来递增信号量的当前资源计数。
// 信号量对象句柄
HANDLE hSemaphore;
UINT ThreadProc15(LPVOID pParam)
{ // 试图进入信号量关口 WaitForSingleObject(hSemaphore, INFINITE); // 线程任务处理 AfxMessageBox("线程一正在执行!"); // 释放信号量计数 ReleaseSemaphore(hSemaphore, 1, NULL); return 0;
}
UINT ThreadProc16(LPVOID pParam)
{ // 试图进入信号量关口 WaitForSingleObject(hSemaphore, INFINITE); // 线程任务处理 AfxMessageBox("线程二正在执行!"); // 释放信号量计数 ReleaseSemaphore(hSemaphore, 1, NULL); return 0;
}
UINT ThreadProc17(LPVOID pParam)
{ // 试图进入信号量关口 WaitForSingleObject(hSemaphore, INFINITE); // 线程任务处理 AfxMessageBox("线程三正在执行!"); // 释放信号量计数 ReleaseSemaphore(hSemaphore, 1, NULL); return 0;
}
……
void CSample08View::OnSemaphore()
{ // 创建信号量对象 hSemaphore = CreateSemaphore(NULL, 2, 2, NULL); // 开启线程 AfxBeginThread(ThreadProc15, NULL); AfxBeginThread(ThreadProc16, NULL); AfxBeginThread(ThreadProc17, NULL);
}
关键段 互斥量 以及信号量相关推荐
- C++关键段、原子锁、互斥量及信号量的实现和区别
1.关键段 CRITICAL_SECTION m_cs; //创建一个关键段 InitializeCriticalSection(&m_cs); //初始化关键段EnterCriticalSe ...
- 临界区,互斥量,信号量,事件的区别
临界区(Critical section)与互斥体(Mutex)的区别 1.临界区只能用于对象在同一进程里线程间的互斥访问:互斥体可以用于对象进程间或线程间的互斥访问. 2.临界区是非内核对象,只在用 ...
- 1.linux系统基础笔记(互斥量、信号量)
操作系统是很多人每天必须打交道的东西,因为在你打开电脑的一刹那,随着bios自检结束,你的windows系统已经开始运行了.如果问大家操作系统是什么?可能有的人会说操作系统就是windows,就是那些 ...
- c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
- 互斥量和信号量的区别
1. 互斥量用于线程的互斥,信号量用于线程的同步. 这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别. 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性.但互斥无法限制访 ...
- linux知识(二)互斥量、信号量和生产者消费者模型
linux知识(二)互斥量.信号量和生产者消费者模型 一.互斥量 产生原因 二.信号量 生产者消费者模型 一.互斥量 产生原因 使用多线程常常会碰到数据混乱的问题,那么使用互斥量,相当于"加 ...
- Linux 多线程同步机制:互斥量、信号量、条件变量
互斥量:互斥量提供对共享资源的保护访问,它的两种状态:lock和unlock,用来保证某段时间内只有一个线程使用共享资源,互斥量的数据类型是pthread_mutex_t 主要涉及函数:pthread ...
- 临界区、事件、互斥量、 信号量--四种控制多线程同步与互斥的方法
// MultiThread.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h"#include <Windows.h> #inclu ...
- 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
最新文章
- 西南民大oj(矩阵快速幂)
- 使用flask的时候遇到的问题及其解答
- 红旗Linux可以兼容,红旗 Linux 桌面操作系统11来了:支持国产自主CPU,全新UI风格设计,兼容面广...
- XML与JavaBean相互转换工具
- eclipse导入github项目
- 配置独立于系统的PYTHON环境
- 字符串、数组、集合在使用时出现空指针怎么办?_03
- Tez 0.9安装部署+hive on tez配置 + Tez-UI
- 模拟手机QQ滑动删除消息
- PHP编译参数 --prefix=/usr/local/php 的“深远”影响
- bash中的算术运算
- 第10章 分离并纠正物理层和数据链路层故障
- overflow与BFC解说
- android 大牛播放组件,大牛播放器安卓版_大牛播放器好不好用
- 工程思维把每件事都当作一个项目来做
- 带宽与网速之间的换算
- [创业-29]:雪崩与狗,创业者真实写照
- JavaScript增加和删除DOM节点
- SWUST OJ#971 #972 返回二叉树宽度和深度
- topcoder赚钱的方法
热门文章
- cal css,CSS calc计算属性
- python文件按行读取变为嵌套列表_迭代两个嵌套的2D列表,其中list2具有list1的行号...
- Adobe illustrator 抽丝剥茧选中多个点 - 连载 13
- 第58课 百钱买百鸡(完整) 3.完善程序 (《小学生C++趣味编程》)
- php输出excel表格乱码和第一个0不显示的解决方法(详细)
- CANopen | 对象字典OD 04 - 创建对象字典的变量(映射变量)
- Java学习之文件操作
- 操作系统课设之Linux 进程管理
- 3倍根号x加1分之一c语言,用C语言将一个数开根号后再取倒数的方法
- 如何获取exception的target异常_三个好习惯,帮你写好Python里的异常处理