互斥访问、临界区、线程同步

本文介绍临界区的基本概念及其在多线程编程中的重要性,通过实例对比了使用临界区前后对缓冲区写操作的影响,展示了如何正确地使用临界区变量避免数据混乱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 临界区的使用原则:

尽晚使用,尽早退出。

记得释放资源。

临界区:每个进程中访问临界资源的那段代码称为临界区。

一般线程同步都是使用临界区来实现的,临界区是系统级的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(&section);

3. 进入和离开临界区

EnterCriticalSection(&section);

 LeaveCriticalSection(&section);

使用临界区后的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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值