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的一个概念. 举一个简单的例子,你一个电脑 ...
随机推荐
- Restful 接口开发 完整版
准备: springboot ssm框架 项目结构:注意 Swagger2Config要和springboot的启动类放在同一级 //pom所需的依赖 <dependency> <g ...
- PADS Layout VX.2.3 更改Logic符号,并更新到原理图
操作系统:Windows 10 x64 工具1:PADS Layout VX.2.3 统一使用A3尺寸的原理图,如果Logic符号画得太大,就会占用过多的面积.如下图所示,电阻的两只引脚的跨度占用了4 ...
- iOS开发之GCD同步主线程、异步主线程
/** 在主线程执行block */ + (void)gs_synExecuteOnMainThread:(void (^)(void))block { if ((nil == block) || ( ...
- thinkphp5简单使用redis缓存
<?php namespace app\index\controller; use think\Controller; use think\Cache\Driver\Redis; class I ...
- java思维导图
https://www.edrawsoft.cn/viewer/public/s/eeca7704686971
- sqlserver给用户配置存储过程查看权限
对应的数据库->安全性->用户名右键属性-->安全对象-->指定所有对象-->选择服务器,里边有一个 查看定义(view any definition) 选项,勾上.
- Docker 学习3 Docker镜像管理基础
一.docker 常用操作及原理 1.docker 常用操作 2.docker 机制 1.docker client端是通过http或者https与server端通信的.个 2.docker 镜像可以 ...
- 安装docker以及问题解决办法
1.使用官方推荐的方式安装 yum-utilsyum install -y yum-utils2.使用如下的命令设置稳定版的 repositoryyum-config-manager \ --a ...
- tp5 mkdir(): Permission denied 问题
今天使用tp5 线上上传图片的时候遇到了一个问题 mkdir(): Permission denied 如图 百度了一下 发现大家都说 chmod -R 777 runtime 能解决问题 尝试了一下 ...
- Git 如何解决部署远程仓库出现 fatal: refusing to merge unrelated histories 问题
想把本地仓库的文件搬到Github,先将远程仓库和本地仓库关联起来: 先到Github上复制远程仓库的SSH地址: 运行 git remote add origin 你复制的地址 理论上—如果在创建 ...