多线程-临界区

函数功能:初始化

函数原型:

void InitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

函数说明:定义关键段变量后必须先初始化。

函数功能:销毁

函数原型:

void DeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

函数说明:用完之后记得销毁。

函数功能:进入关键区域

函数原型:

void EnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

函数说明:系统保证各线程互斥的进入关键区域。

函数功能:离开关关键区域

函数原型:

void LeaveCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

输出将范文tickets设置为临界资源,由两个进程轮流访问

#include<stdio.h>
#include<process.h>
#include<windows.h>
int tickets=50;
CRITICAL_SECTION g_cs;
unsigned int __stdcall Fun1(VOID *lp)
{	
	while(true)
	{
                Sleep(1);//这个要在临界区外面,不然要了资源切换了线程导致浪费
		EnterCriticalSection(&g_cs);
	
		if(tickets>0)
		{
			printf("thread1 %d\n",tickets--);
			LeaveCriticalSection(&g_cs);
		}
		else
		{
			LeaveCriticalSection(&g_cs);
			break;
		}
	}
	return 0;
}
unsigned int __stdcall Fun2(VOID *lp)
{
	while(true)
	{
                Sleep(1);
		EnterCriticalSection(&g_cs);
		if(tickets>0)
		{
			printf("thread2 %d\n",tickets--);
			LeaveCriticalSection(&g_cs);
		}
		else
		{
			LeaveCriticalSection(&g_cs);
			break;
		}
	}
	return 0;
}
int main()
{
InitializeCriticalSection(&g_cs);//初始化要在定义handle前面,不然调用了线程可能临界区并没有初始化
HANDLE handle1,handle2;
handle1=(HANDLE)_beginthreadex(NULL,0,Fun1,NULL,0,NULL);
handle2=(HANDLE)_beginthreadex(NULL,0,Fun2,NULL,0,NULL);
CloseHandle(handle1);
CloseHandle(handle2);

Sleep(4000);
DeleteCriticalSection(&g_cs);
return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端儿

简单的鼠标可拖动DIV 兼容IE/FF

一个div,注册监听onmousedown事件,然后处理获取的对象及其相关值(对象高度,clientX/clientY位置等)

1421
来自专栏跟着阿笨一起玩NET

winform程序中将控件置于最顶层或最底层的方法

一种方法是在WinForm窗体中使用Controls控件集的SetChildIndex方法,该方法将子控件设定为指定的索引值,其方法原型如下:

3552
来自专栏游戏杂谈

HTML5的data-* 要注意的问题

首先第一个问题,比较简单,直接使用dom.dataset,如果“===”undefined则不支持

1292
来自专栏从零开始学自动化测试

selenium+python自动化93-鼠标事件(ActionChains)源码详解

ActionChains简介 actionchains是selenium里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互。...

3775
来自专栏swag code

双缓冲原理在Awt和Swing中实现消除闪烁方法总结

AWT是抽象窗口工具箱的缩写,它为编写图形用户界面提供了用户接口,通过这个接口就可以继承很多方法,省去了很多工作。AWT还能使应用程序更好地同用户进行交互。

1442
来自专栏拂晓风起

Flash:DisplayObject的矩阵旋转(移动/修改注册点,修改旋转点)

1122
来自专栏代码世界

jQuery

jQuery jQuery介绍 jQuery 是一个轻量级的、兼容多浏览器的JavaScript 库; jQuery 使用户能够更方便地处理HTML Docum...

4635
来自专栏子勰随笔

markdown语法简介

1759
来自专栏林德熙的博客

C#同步方法转异步 创建新线程AMP 转 EAP

最简单的方法是创建一个新的线程,创建的方法是使用 Task.Run ,请看下面代码,原来有一个函数 Delay 需要把他转换为异步,就可以使用 DelayAsy...

1032
来自专栏WD学习记录

辅助方法、模型、视图数据

在相应的视图中,使用 ViewBag 中的值来为 TextBox 辅助方法命名,可以实现渲染显示价格的文本框:

872

扫码关注云+社区

领取腾讯云代金券