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的一个概念. 举一个简单的例子,你一个电脑 ...
随机推荐
- USACO15DEC最大流MaxFlow
传送门 这是个假的最大流,其实是一个用树剖+线段树就能解决的事情 题目中的道路会对路径上的造成压力,最后询问最大的压力 其实就等价于对每条路径上的点加上 1 的权值,并且最后询问整个树中的最大值 然后 ...
- python学习记录20181220
1.pycharm中,有个快捷键,输入完成后 按Ctrl+Alt+L就可以自动添加空格
- vscode插件解析-BookMark
BookMark (书签):在编辑器中标记行并轻松跳转到它们. commands 书签:Toggle 标记/取消标记带书签的行 书签:Jump to Next 将光标向前移动到下面的书签 书签: ...
- source ~/.bash_profile 只生效一次 解决方案
在~/.zshrc文件最后,增加一行: source ~/.bash_profile
- margin:auto你真的理解么?
含义 margin:auto是具有强烈计算意味的关键字,用来计算元素对应方向应该获得的剩余空间大小 填充规则 (1) 如果一侧定值,一侧auto,则auto为剩余空间大小 (2) 如果两侧均是auto ...
- jQuery基础操作
1.jQuery的介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库.jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Ajax交 ...
- Docker----在Docker中部署Asp.net core2.1以及修改发布
本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序,以及修改系统之后,发布更新.本文章采用自定义的Docker文件 系统要求: 1.服务器或本地已经安装docker 一.创建一 ...
- C# 通过 Quartz .NET 实现 schedule job 的处理
在实际项目的开发过程中,会有这样的功能需求:要求创建一些Job定时触发运行,比如进行一些数据的同步. 那么在 .Net Framework 中如何实现这个Timer Job的功能呢? 这里所讲的是借助 ...
- 记一次线上Zabbix对Redis监控实录
前言:Redis作为缓存服务器我想大家都比较的熟悉,那么,如果想要更好的维护和监控,那么我们会对其redis服务器统一监控起来,如何监控呢?如果在生产环境一台服务器部署多个redis,这样就会出现多个 ...
- UOJ#375. 【ZJOI2018】迷宫
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ375.html 题解 首先,我们可以建出一个 k 个点的自动机,第 i 个点表示当前数对 k 取模为 i- ...