关键区域(CriticalSection)

临界区是为了确保同一个代码片段在同一时间只能被一个线程访问,与原子锁不同的是临界区是多条指令的锁定,而原子锁仅仅对单条操作指令有效;临界区和原子锁只能控制同一个进程中线程的同步

使用方法:

、初始化:InitializeCriticalSection;
、删除:DeleteCriticalSection;
、进入:EnterCriticalSection(可能造成阻塞);
、尝试进入:TryEnterCriticalSection(不会造成阻塞);
、离开:LeaveCriticalSection;

固有特点(优点+缺点):
1、是一个用户模式的对象,不是系统核心对象;
2、因为不是核心对象,所以执行速度快,有效率;
3、因为不是核心对象,所以不能跨进程使用;
4、可以多次“进入”,但必须多次“退出”;
5、最好不要同时进入或等待多个 Critical Sections,容易造成死锁;
6、无法检测到进入到 Critical Sections 里面的线程当前是否已经退出!

一般错误的情况:

#include <stdio.h>
#include <windows.h> long g_nNum = ;
DWORD WINAPI ThreadProc(__in LPVOID lpParameter);
const int THREAD_NUM = ; int main()
{ HANDLE handle[THREAD_NUM];
g_nNum = ;
int var = ;
while ( var< THREAD_NUM)
{
handle[ var++] = CreateThread(NULL, , ThreadProc, NULL, , NULL); }
WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); for( var=; var<sizeof(handle); var++)
{
CloseHandle(handle[var]);
} return ;
} DWORD WINAPI ThreadProc(__in LPVOID lpParameter)
{
Sleep();
g_nNum++;
Sleep();
printf("当前计数为:%d\n",g_nNum);
return ;
}

运行2次结果:

用了关键区域的情况:

#include <stdio.h>
#include <windows.h> long g_nNum = ;
DWORD WINAPI ThreadProc(__in LPVOID lpParameter);
const int THREAD_NUM = ; CRITICAL_SECTION g_ThreadCode; int main()
{ HANDLE handle[THREAD_NUM];
g_nNum = ;
int var = ;
InitializeCriticalSection(&g_ThreadCode);
while ( var< THREAD_NUM)
{
handle[ var++] = CreateThread(NULL, , ThreadProc, NULL, , NULL);
}
WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
DeleteCriticalSection( &g_ThreadCode ); for( var=; var<sizeof(handle); var++)
{
CloseHandle(handle[var]);
} return ;
} DWORD WINAPI ThreadProc(__in LPVOID lpParameter)
{
EnterCriticalSection( &g_ThreadCode );
g_nNum++;
printf("当前计数为:%d\n",g_nNum);
LeaveCriticalSection( &g_ThreadCode );
return ;
}

window下线程同步之(Critical Sections(关键代码段、关键区域、临界区域)的更多相关文章

  1. window下线程同步之(Mutex(互斥器) )

    使用方法: 1.创建一个互斥器:CreateMutex: 2.打开一个已经存在的互斥器:OpenMutex: 3.获得互斥器的拥有权:WaitForSingleObject.WaitForMultip ...

  2. window下线程同步之(Semaphores(信号量))

    HANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes _In_ LONG lIniti ...

  3. window下线程同步之(Event Objects(事件))

    Event 方式是最具弹性的同步机制,因为他的状态完全由你去决定,不会像 Mutex 和 Semaphores 的状态会由类似:WaitForSingleObject 一类的函数的调用而改变,所以你可 ...

  4. window下线程同步之(原子锁)

    原子锁:当多个线程同时对同一资源进行操作时,由于线程间资源的抢占,会导致操作的结果丢失或者不是我们预期的结果. 比如:线程A对一个变量进行var++操作,线程B也执行var++操作,当线程A执行var ...

  5. win32多线程学习总结:同步机制critical sections

    Critical sections是win32中最容易使用的同步机制,用来处理一份共享资源,共享资源指的是每次只能够被一个线程处理的资源,包括内存.数据结构.文件等. 优点: 1.使用便捷,即声明即使 ...

  6. 线程同步——用户模式下线程同步——Slim读写锁实现线程同步

    //Slim读/写锁实现线程同步 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 和 ...

  7. Linux下线程同步的几种方法

    Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码.  1. 初始化锁 int pthrea ...

  8. 线程同步——用户模式下线程同步——Interlocked实现线程同步

    线程同步分为用户模式下的线程同步和内核对象的线程同步. 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 //1.利用原子访问: Interlocked系列函数,关于Interlocke ...

  9. MFC线程(二):线程同步临界区CRITICAL SECTION

    当多个线程同时使用相同的资源时,由于是并发执行,不能保证先后顺序.所以假如时一个公共变量被几个线程同时使用会造成该变量值的混乱. 下面来举个简单例子. 假如有一个字符数组变量 char g_charA ...

随机推荐

  1. [存一下]iptables模块

    介绍地址: http://www.tummy.com/blogs/2005/07/17/some-iptables-modules-you-probably-dont-know-about/ [1] ...

  2. 题解【luogu1073 最优贸易】

    Solution 考虑原图是 DAG 时怎么做. 拓扑排序 + dp ,令 dp[i] 表示 \(1\) 到 \(i\) 的路径上最小的卖出价格.转移方程就是对每一个可以到达这个点的 dp 取个 mi ...

  3. 双向数据绑定实现之Object.defineProperty

    vue.js利用的是es5的 defineproperty 特性实现的双向数据绑定,了解一下基本原理. 举例 var person= {}; Object.defineProperty(person, ...

  4. 话说Svn与Git的区别

    这篇主要是谈谈两者的区别,至于谁优谁劣看官自己思考吧! 把第一条理解到位思想到位了做起来才会有的放矢,其他几条都是用的时候才能体会到 1) 最核心的区别Git是分布式的,而Svn不是分布的.能理解这点 ...

  5. UVA 1649 Binomial coefficients

    https://vjudge.net/problem/UVA-1649 题意: 输入m,求所有的C(n,k)=m m<=1e15 如果枚举n,那么C(n,k)先递增后递减 如果枚举k,那么C(n ...

  6. django中处理表单的经典流程

    def form_process_view(request): if request.method == 'POST': # 请求为 POST,利用用户提交的数据构造一个绑定了数据的表单 form = ...

  7. 【BZOJ2850】巧克力王国 [KD-tree]

    巧克力王国 Time Limit: 60 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 巧克力王国里的巧克力都是由牛奶和 ...

  8. 打印菱形(c语言)

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { // 定 ...

  9. bzoj 1912 tree_dp

    这道题我们加一条路可以减少的代价为这条路两端点到lca的路径的长度,相当于一条链,那么如果加了两条链的话,这两条链重复的部分还是要走两遍,反而对答案没有了贡献(其实这个可以由任意两条链都可以看成两条不 ...

  10. 【HNOI】矩阵染色 数论

    [题目描述]一个2*i的矩阵,一共有m种颜色,相邻两个格子颜色不能相同,m种颜色不必都用上,f[i]表示这个答案,求Σf[i]*(2*i)^m (1<=i<=n)%p. [数据范围] 20 ...