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;
 
}
posted @   liulun  阅读(580)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示