Win32线程同步 - 临界区(关键段)

/*

*        临界区(关键段):线程同步方式,用于限制“公用代码”一次只能被一个线程使用

*        使用示例:全局变量

*        使用限制:只能用于同一个进程中的线程,不能跨进程同步

*/

#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <stdlib.h>

// 定义一个临界区
CRITICAL_SECTION g_cs;

// 线程函数
unsigned __stdcall ThreadFunc(LPVOID lpVoid)
{
	EnterCriticalSection(&g_cs);	// 进入临界区,如果有其他线程则等待
	printf("%s\n", lpVoid);		// 受保护代码
	LeaveCriticalSection(&g_cs);	// 退出临界区,其他线程可以进来
	return TRUE;
}

int main()
{
	// 初始化临界区
	InitializeCriticalSection(&g_cs);

	HANDLE ht1, ht2, ht3;
	char s1[128] = "first";
	char s2[128] = "second";
	char s3[128] = "third";

	// 创建线程
	ht1 = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, s1, 0, NULL);
	ht2 = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, s2, 0, NULL);
	ht3 = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, s3, 0, NULL);

	// 线程作为核心对象的引用计数减1(创建线程之后引用计数为2)
	// 即创建线程之后一共有2个handle对应到此对象,一个为线程本身,一个为创建线程的线程
	// 减1之后,线程结束时引用计数再次减1,系统将删除线程内核对象
	// 若没有减一,则引用计数在线程结束后仍为1,程序结束运行后线程内核对象被系统回收,
	// 而在程序运行过程中已经造成了内存泄漏的问题

	// 关闭线程句柄
	CloseHandle(ht1);
	CloseHandle(ht2);
	CloseHandle(ht3);

	// 主线程等待子线程结束
	WaitForSingleObject(ht1, INFINITE);
	WaitForSingleObject(ht2, INFINITE);
	WaitForSingleObject(ht3, INFINITE);


	// 删除临界区
	DeleteCriticalSection(&g_cs);

	system("pause");

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值