很多项目涉及多线操作,多个线程访问共享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