zoukankan      html  css  js  c++  java
  • windows api学习笔记用临界区对象使线程同步

    #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;
    
    }
    
  • 相关阅读:
    年少时的"胡思乱想"
    daemon框架
    MVC框架,see again
    《Redis设计与实现》读书笔记
    小胖妞洗发水广告
    项目视图 Project Browser
    Unity 基础
    Unity手册-Unity概述
    rabbitmq 命令&& rabbitmq教程(一)
    C#动态方法调用 提高程序的扩展性
  • 原文地址:https://www.cnblogs.com/liulun/p/1666355.html
Copyright © 2011-2022 走看看