之前学习了临界区的使用,但是使用方式是极其不方便的,还使用了一个全局变量CRITICAL_SECTION section;调用函数还要访问变量,整个临界区代码散落在各地,本文使用封装来增加代码的可读性。
注:仍然要使用一个全局变量。
封装XMutex类代码如下:
//.h
#pragma once
#ifdef XPLATFORM_EXPORTS
#define XPLATFORM_API __declspec(dllexport)
#else
#define XPLATFORM_API __declspec(dllimport)
#endif
class XPLATFORM_API XMutex
{
public:
XMutex();
~XMutex();
void Lock();
void unLock();
private:
void * section; //.h中无需引用windows.h的头文件,而在实现(.cpp)中引用
};
//.cpp
#include "stdafx.h"
#include "XMutex.h"
#include <windows.h>
XMutex::XMutex()
{
this->section = new CRITICAL_SECTION;
InitializeCriticalSection((CRITICAL_SECTION*)section);
}
XMutex::~XMutex()
{
}
void XMutex::Lock()
{
EnterCriticalSection((CRITICAL_SECTION*)section);
}
void XMutex::unLock()
{
LeaveCriticalSection((CRITICAL_SECTION*)section);
}
此时我不再直接使用系统API,而是使用封装好的类进行调用:
#include <iostream>
#include "XThread.h"
#include "XMutex.h"
#include "windows.h"
using namespace std;
static char buffer[1024] = { 0 };
XMutex mutex;
class Mythread :public XThread
{
public :
void Main()
{
for (;;)
{
int size = sizeof(buffer);
mutex.Lock();
for (int i = 0; i < size; i++)
{
buffer[i] = c;
}
buffer[size - 1] = '\0';
cout <<'['<< buffer<<']'<<endl;
mutex.unLock();
Sleep(500);
}
}
char c;
};
int main()
{
Mythread s1;
Mythread s2;
s1.c = 'A';
s2.c = 'B';
s1.Start();
s2.Start();
getchar();
return 0;
}
结果如下: