- 临界区的使用原则:
尽晚使用,尽早退出。
记得释放资源。
临界区:每个进程中访问临界资源的那段代码称为临界区。
一般线程同步都是使用临界区来实现的,临界区是系统级的API,是最高效的一种方法。
当对一个Buffer写入数据时,如果不加入临界区,则会导致写乱,即ABBBBAAAAABBBBBBB....。我们想要的结果为AAAAAAAAA......,或者BBBBBBBBBBBB........
无临界区代码如下(XThread类可以在之前的文章中找到,本文不做赘述):
#include <iostream>
#include "XThread.h"
#include "windows.h"
using namespace std;
static char buffer[1024] = { 0 };
class Mythread :public XThread
{
public :
void Main()
{
for (;;)
{
int size = sizeof(buffer);
for (int i = 0; i < size; i++)
{
buffer[i] = c;
Sleep(1);
}
buffer[size - 1] = '\0';
cout <<'['<< buffer<<']'<<endl;
Sleep(500);
}
}
char c;
};
int main()
{
Mythread s1;
Mythread s2;
s1.c = 'A';
s2.c = 'B';
s1.Start();
s2.Start();
getchar();
return 0;
}
使用临界区:
1. 定义临界区变量
CRITICAL_SECTION section;
2. 初始化临近区
InitializeCriticalSection(§ion);
3. 进入和离开临界区
EnterCriticalSection(§ion);
LeaveCriticalSection(§ion);
使用临界区后的main代码如下:
#include <iostream>
#include "XThread.h"
#include "windows.h"
using namespace std;
static char buffer[1024] = { 0 };
CRITICAL_SECTION section;
class Mythread :public XThread
{
public :
void Main()
{
for (;;)
{
int size = sizeof(buffer);
EnterCriticalSection(§ion);
for (int i = 0; i < size; i++)
{
buffer[i] = c;
}
buffer[size - 1] = '\0';
cout <<'['<< buffer<<']'<<endl;
LeaveCriticalSection(§ion);
Sleep(500);
}
}
char c;
};
int main()
{
InitializeCriticalSection(§ion);
Mythread s1;
Mythread s2;
s1.c = 'A';
s2.c = 'B';
s1.Start();
s2.Start();
getchar();
return 0;
}