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;
    
    }
    
  • 相关阅读:
    java学习day08--面向对象--继承+方法重写+static关键字
    java学习day07--面向对象--封装+this关键字+构造器
    java学习day06-面向对象--类和对象
    依赖管理
    NSQ消息队列
    logger包
    time包
    fmt包
    Go_Protobu
    Go_性能优化
  • 原文地址:https://www.cnblogs.com/liulun/p/1666355.html
Copyright © 2011-2022 走看看