关键段(主要是用户模式下的线程同步,但是竞争激烈的情况下会进入内核态)

一般是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);
}   

关键段 互斥量 以及信号量相关推荐

  1. C++关键段、原子锁、互斥量及信号量的实现和区别

    1.关键段 CRITICAL_SECTION m_cs; //创建一个关键段 InitializeCriticalSection(&m_cs); //初始化关键段EnterCriticalSe ...

  2. 临界区,互斥量,信号量,事件的区别

    临界区(Critical section)与互斥体(Mutex)的区别 1.临界区只能用于对象在同一进程里线程间的互斥访问:互斥体可以用于对象进程间或线程间的互斥访问. 2.临界区是非内核对象,只在用 ...

  3. 1.linux系统基础笔记(互斥量、信号量)

    操作系统是很多人每天必须打交道的东西,因为在你打开电脑的一刹那,随着bios自检结束,你的windows系统已经开始运行了.如果问大家操作系统是什么?可能有的人会说操作系统就是windows,就是那些 ...

  4. c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  5. 互斥量和信号量的区别

    1. 互斥量用于线程的互斥,信号量用于线程的同步. 这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别. 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性.但互斥无法限制访 ...

  6. linux知识(二)互斥量、信号量和生产者消费者模型

    linux知识(二)互斥量.信号量和生产者消费者模型 一.互斥量 产生原因 二.信号量 生产者消费者模型 一.互斥量 产生原因 使用多线程常常会碰到数据混乱的问题,那么使用互斥量,相当于"加 ...

  7. Linux 多线程同步机制:互斥量、信号量、条件变量

    互斥量:互斥量提供对共享资源的保护访问,它的两种状态:lock和unlock,用来保证某段时间内只有一个线程使用共享资源,互斥量的数据类型是pthread_mutex_t 主要涉及函数:pthread ...

  8. 临界区、事件、互斥量、 信号量--四种控制多线程同步与互斥的方法

    // MultiThread.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h"#include <Windows.h> #inclu ...

  9. 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

最新文章

  1. 西南民大oj(矩阵快速幂)
  2. 使用flask的时候遇到的问题及其解答
  3. 红旗Linux可以兼容,红旗 Linux 桌面操作系统11来了:支持国产自主CPU,全新UI风格设计,兼容面广...
  4. XML与JavaBean相互转换工具
  5. eclipse导入github项目
  6. 配置独立于系统的PYTHON环境
  7. 字符串、数组、集合在使用时出现空指针怎么办?_03
  8. Tez 0.9安装部署+hive on tez配置 + Tez-UI
  9. 模拟手机QQ滑动删除消息
  10. PHP编译参数 --prefix=/usr/local/php 的“深远”影响
  11. bash中的算术运算
  12. 第10章 分离并纠正物理层和数据链路层故障
  13. overflow与BFC解说
  14. android 大牛播放组件,大牛播放器安卓版_大牛播放器好不好用
  15. 工程思维把每件事都当作一个项目来做
  16. 带宽与网速之间的换算
  17. [创业-29]:雪崩与狗,创业者真实写照
  18. JavaScript增加和删除DOM节点
  19. SWUST OJ#971 #972 返回二叉树宽度和深度
  20. topcoder赚钱的方法

热门文章

  1. cal css,CSS calc计算属性
  2. python文件按行读取变为嵌套列表_迭代两个嵌套的2D列表,其中list2具有list1的行号...
  3. Adobe illustrator 抽丝剥茧选中多个点 - 连载 13
  4. 第58课 百钱买百鸡(完整) 3.完善程序 (《小学生C++趣味编程》)
  5. php输出excel表格乱码和第一个0不显示的解决方法(详细)
  6. CANopen | 对象字典OD 04 - 创建对象字典的变量(映射变量)
  7. Java学习之文件操作
  8. 操作系统课设之Linux 进程管理
  9. 3倍根号x加1分之一c语言,用C语言将一个数开根号后再取倒数的方法
  10. 如何获取exception的target异常_三个好习惯,帮你写好Python里的异常处理