互斥量的封装

来源:互联网 发布:java jsonarray 编辑:程序博客网 时间:2024/06/06 02:48

很多项目涉及多线操作,多个线程访问共享buffer时,一般是需要按顺序访问的,必须保证共享buffer在任意时刻不能同时被读写,否则会引起数据错乱,无法控制数据,共享buffer里面的数据变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程按顺序访问变量。windows系统提供了使用互斥变量的函数。

 互斥变量的类型为CRITICAL_SECTION,首先定义一个互斥变量CRITICAL_SECTION cs;定义互斥变量就是创建一个临界区

系统提供4个相关函数

初始化互斥变量(初始化临界区):InitializeCriticalSection( &cs );

进入临界区:EnterCriticalSection( &cs);

离开临界区:LeaveCriticalSection( &cs );

删除临界区:DeleteCriticalSection( &cs );

在任意时刻有且仅有一个线程进入临界区,假如A线程已经进入临界区且未离开,接着B线程也想进入临界区,那么B线程在执行到EnterCriticalSection( &cs);这个语句时会被挂起,停止执行后面的程序,直到A线程离开临界区后,B线程才会恢复,然后执行后面的程序。

用户为了更加方便地使用互斥量,可以将系统函数封装成自己的类,并放到一个头文件中,如果想调用这个类包含这个头文件即可

下面代码就是在一个头文件中将系统函数封装成自己的类

#ifndef TINYCRITICALSECTION_LK       /
#define TINYCRITICALSECTION_LK#include <windows.h>class TinyCriticalSection       //类名{public:TinyCriticalSection(){InitializeCriticalSection( &cs );}void Lock(){EnterCriticalSection( &cs);}void Unlock(){LeaveCriticalSection( &cs );}~TinyCriticalSection(){DeleteCriticalSection( &cs );} private:CRITICAL_SECTION cs;};#endif


0 0
原创粉丝点击