Windows多线程中关键段(Critical Section)的应用
先看如下代码:(用Visual Studio 2010按照Win32 Console程序创建向导创建)
#include "stdafx.h" #include <process.h>
#include <windows.h>
#include <iostream> #include <stdio.h>
#include <stdlib.h> using namespace std; UINT WINAPI ThreadA(void *args);
UINT WINAPI ThreadB(void *args); static CRITICAL_SECTION gCS = {}; int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwWait = ; InitializeCriticalSection(&gCS);
HANDLE threadA_handle = (HANDLE)_beginthreadex(NULL, , ThreadA, NULL, CREATE_SUSPENDED, NULL);
HANDLE threadB_handle = (HANDLE)_beginthreadex(NULL, , ThreadB, NULL, CREATE_SUSPENDED, NULL); if (INVALID_HANDLE_VALUE == threadA_handle)
{
cout << GetLastError() << endl;
} ResumeThread(threadA_handle);
ResumeThread(threadB_handle); HANDLE handleArry[] = {threadA_handle,
threadB_handle}; dwWait = WaitForMultipleObjects(, handleArry, true, );
cout << dwWait << " " << GetLastError() << endl; DeleteCriticalSection(&gCS);
CloseHandle(threadA_handle);
CloseHandle(threadB_handle); return ;
} UINT WINAPI ThreadA(void *args)
{
UINT i = ;
EnterCriticalSection(&gCS);
for (i=; i<; ++i)
{
cout << "A: " << i << endl;
}
cout << endl;
LeaveCriticalSection(&gCS); return ;
} UINT WINAPI ThreadB(void *args)
{
UINT j = ;
EnterCriticalSection(&gCS);
for (j=; j<; ++j)
{
cout << "B: " << j << endl;
}
cout << endl;
LeaveCriticalSection(&gCS);
return ;
}
【总结】:
关键段属于用户态下的线程同步方式,因此比较快;
关键段用于两个互斥的线程,以保证每个线程独占资源,这种应用的场景举例如下:
- 线程A用于实时响应用户的请求访问一个资源;
- 线程B用于周期性地访问同一个资源;
- 为了保证资源不被破坏,可以采用关键段的方式,同一时刻只允许一个线程访问同一个资源;
- 采用线程优先级的方式(线程B的优先级低于线程A)无法实现上述要求,因为Windows系统采用抢占式多线程方式,因此当线程B访问资源时,线程A可以抢占CPU访问同一个资源,那么当线程B可以访问同一个资源时,该资源可能已经被修改了;
【参考】
Windows多线程中关键段(Critical Section)的应用的更多相关文章
- 临界区代码 critical section Locks and critical sections in multiple threads
临界区 在同步的程序设计中,临界区段(Critical section)指的是一个访问共享资源(例如:共享设备或是共享存储器)的程序片段,而这些共享资源有无法同时被多个线程访问的特性. 当有线程进入临 ...
- windows多线程(四) 关键段 CriticalSection
一.问题回顾 我们上一篇文章最后的程序的输出 g_Count 的值不是每次都正确,原因是没有对全局资源 g_Count 进行互斥访问(就是同一时刻只能由一个线程访问),接下来我们就来说一下使用关键段来 ...
- windows多线程(六) 互斥量Mutex与关键段CriticalSection比较
一.关键段CS 和 互斥量Mutex 的相同点:都有线程拥有权 关键段和互斥量都有线程拥有权,即可以被一个线程拥有.在 前面讲关键段CS的文章中有说到,关键段结构体的第四个参数保存着拥有该关键段的线程 ...
- [一个经典的多线程同步问题]解决方案一:关键段CS
前面提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文先介绍如何使用关键段,然后再深层次的分析下关键段的实现机制和原理. 关键段CRITICA ...
- 多线程面试题系列(5):经典线程同步 关键段CS
上一篇提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题.本文首先介绍下如何使用关键段,然后再深层次的分析下关键段的实现机制与原理.关键段CRITIC ...
- 秒杀多线程第五篇 经典线程同步 关键段CS
本文首先介绍下如何使用关键段,然后再深层次的分析下关键段的实现机制与原理. 关键段CRITICAL_SECTION一共就四个函数,使用很是方便.下面是这四个函数的原型和使用说明. 函数功能:初始化 函 ...
- 转---秒杀多线程第五篇 经典线程同步 关键段CS
上一篇<秒杀多线程第四篇 一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文首先介绍下如何使用关键段,然 ...
- windows 下 Mutex和Critical Section 区别和使用
Mutex和Critical Section都是主要用于限制多线程(Multithread)对全局或共享的变量.对象或内存空间的访问.下面是其主要的异同点(不同的地方用黑色表示). Mutex Cri ...
- Windows内核中的CPU架构-8-任务段TSS(task state segment)
Windows内核中的CPU架构-8-任务段TSS(task state segment) 任务段tss(task state segment)是针对于CPU的一个概念. 举一个简单的例子,你一个电脑 ...
随机推荐
- js数据结构与算法——队列
<script> //创建一个队列 function Queue(){ let items = []; //向队尾添加一个新的项 this.enqueue = function(eleme ...
- SpringBoot参数注解
1.@RequestParam有无区别 1.1 @GetMapping("/name/id")public Result managerNameIsRepeat(@RequestP ...
- window10 蓝牙只能发不能收文件解决办法
打开“通过蓝牙发送和接收文件”,在“接收文件”界面中无法接收蓝牙发送的文件 解决办法: 1. win+R后,输入msconfig,回车 2. 点击服务,勾选隐藏Microsoft服务,点击全部禁用 3 ...
- Hive 2.1.1 学习笔记
1.修改conf下的配置文件cp -a hive-default.xml.template hive-site.xml2.进入bin目录启动hive./hive 报错Exception in thre ...
- MyBatisPlus的通用查询,简直可以丢弃Dao和mapper.xml了
/** * * @author shenjing * @date 2018/6/20 */ @Service public class LocalDispatchServiceImpl extends ...
- ansible的modules
fetch :从远端服务器拉取文件到本地 dest 依赖 本地存放拉取到的文件路径, 如果flat=yes,则会在该路径下直接存放文件, 如果flat=no,则会在该路径下生成每个服务器的in ...
- Flink写入kafka时,只写入kafka的部分Partitioner,无法写所有的Partitioner问题
1. 写在前面 在利用flink实时计算的时候,往往会从kafka读取数据写入数据到kafka,但会发现当kafka多个Partitioner时,特别在P量级数据为了kafka的性能kafka的节点有 ...
- C# 模拟键盘操作SendKey(),SendKeys()
模拟键盘输入就是使用以下2个语法实现的. SendKeys.Send(string keys); //模拟汉字(文本)输入SendKeys.SendWait(string keys); //模拟按键 ...
- 【Vue】删除数组元素,导致剩余元素被重新渲染
最近在项目中有使用Vue,然而在开发过程中发现,当我对数组中的元素进行删除时,会导致该元素后面的元素没有被重新渲染. html代码如下:有两个组件:一个是Main组件,用来包含所有的内容容器:一个是子 ...
- javafx由浅到深的 认识(一)
javafx是一款比较新兴的语言框架,随着javafx越来越实用,估计许多程序员也会慢慢接触它,故我在这里对它由浅到深进行介绍一下. 首先,要了解javafx,就应该先知道.xml文件的布局软件,以往 ...