前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >windows api学习笔记-用临界区对象使线程同步

windows api学习笔记-用临界区对象使线程同步

作者头像
liulun
发布2022-05-09 11:42:10
4440
发布2022-05-09 11:42:10
举报
文章被收录于专栏:liulunliulun
代码语言:javascript
复制
#include <windows.h>
#include <iostream>
#include <process.h>
using namespace std;


int g_nCount1 = 0;
int g_nCount2 = 0;
CRITICAL_SECTION g_cs;//临界区
BOOL g_bContinue = TRUE;//线程结束标志

UINT WINAPI MyThread(LPVOID)
{
	while(g_bContinue)
	{
		::EnterCriticalSection(&g_cs);//如果另一个线程在临界区的话,当前线程会一直等待下去
		g_nCount1++;
		g_nCount2++;
		::LeaveCriticalSection(&g_cs);//把临界区还给Windows
	}
	return 0;
}

int main()
{
	UINT uThreadId;
	HANDLE h[2];
	::InitializeCriticalSection(&g_cs);//临界区初始化
	h[0] = (HANDLE)::_beginthreadex(
		NULL,//线程安全性
		0,//线程堆栈大小
		MyThread,//线程函数的名称
		NULL,//线程函数的参数
		0,//立即启动
		&uThreadId//内核给新生成的线程分配的线程ID
		);
	h[1] = (HANDLE)::_beginthreadex(
		NULL,//线程安全性
		0,//线程堆栈大小
		MyThread,//线程函数的名称
		NULL,//线程函数的参数
		0,//立即启动
		&uThreadId//内核给新生成的线程分配的线程ID
		);
	::Sleep(600);
	g_bContinue = FALSE;
	::WaitForMultipleObjects(
		2,//要等待内核对象的数量
		h,//句柄数组
		TRUE,//是否要等待所有内核对象都成为受信状态
		INFINITE//无限期等待下去
		);
	::CloseHandle(h[0]);
	::CloseHandle(h[1]);
	::DeleteCriticalSection(&g_cs);//删除林界区
	cout<<g_nCount1<<"       "<<g_nCount2<<endl;
	char a;
	cin >> a;

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档