VC 多线程使用临界区

// CsTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>

int g_Num_One = 0;
CRITICAL_SECTION g_cs;

DWORD WINAPI ThreadProc(LPVOID lpParam)
{

    int nTmp = 0;
	int i = 0;
    for (i = 0; i < 10; i ++ )
    {
		//注释掉临界区,全局变量数据会乱,在临界区只允许一个线程进来执行
        EnterCriticalSection(&g_cs);
        nTmp = g_Num_One;
        nTmp ++;
        Sleep(1);
        g_Num_One = nTmp;
		printf("%d %d\n",g_Num_One,nTmp);
        LeaveCriticalSection(&g_cs);
		//每条线程循环10次
    }
	//printf("线程执行");
    return 0;
}

int main(int argc, char* argv[])
{
    InitializeCriticalSection(&g_cs);
    HANDLE hThread[10] = { 0 };
	int i = 0;
    for (i = 0; i < 10; i ++)
    {
        hThread[i] = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
        if ( hThread[i] == NULL )
        {
            printf("%d CreateThread Error \r\n", i);
        }
    }

    WaitForMultipleObjects(10, hThread, TRUE, INFINITE);

    printf("%d \r\n", g_Num_One);
    
    for ( i = 0; i < 10; i ++ )
    {
        CloseHandle(hThread[i]);
    }
    DeleteCriticalSection(&g_cs);
	system("pause");

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值