Visual C++网络编程经典案例详解 第3章 多线程与异步套接字编程 实现线程同步 临界区对象 使用API函数操作临界区

临界区对象是指当用户使用某个线程代码访问共享资源时
必须使代码独享该资源
不允许其他线程程序访问该资源
带该代码段访问完资源后
其他程序才能对资源进行访问
好像试衣间 要一个人用完 其他人才能用

#include <windows.h>                            //包含头文件
#include <stdio.h>

DWORD WINAPI myfun1(LPVOID lpParameter );//声明线程函数
DWORD WINAPI myfun2(LPVOID lpParameter );

static int a1=0;                                //定义全局变量并初始化
CRITICAL_SECTION Section;                        //定义临界区对象

int main()                                        //主函数
{

    InitializeCriticalSection(&Section);             //初始化临界区对象

    HANDLE h1,h2;                                    //定义线程句柄
    h1=::CreateThread(NULL,0,myfun1,NULL,0,NULL);    //创建线程1
    printf("线程1开始运行!\r\n");
    h2=::CreateThread(NULL,0,myfun2,NULL,0,NULL);    //创建线程2
    printf("线程2开始运行!\r\n");
    ::CloseHandle(h1);                                //关闭线程句柄对象
    ::CloseHandle(h2);

    ::Sleep(10000);                                    //程序睡眠10秒
    printf("正常退出程序请按‘q'\r\n");
    while(1)
    {
        if(getchar()=='q')                                //如果用户输入字符q
        {
            DeleteCriticalSection(&Section);            //删除临界区对象
            return 0;
        }
    }
}

DWORD WINAPI myfun1(LPVOID lpParameter)         //线程函数1
{
    while(1)                            
    {
        EnterCriticalSection(&Section);            //进入临界区
        a1++;                                        //变量自加
        if(a1<10000)                                //设置变量a1小于10000
        {
            //::Sleep(1000);                                //程序睡眠1秒
            printf("线程1正在计数%d\r\n",a1);
            LeaveCriticalSection(&Section);                //离开临界区
        }
        else                                        //如果变量大于10000
        {
            LeaveCriticalSection(&Section);            //离开临界区
            break;                                    //跳出循环
        }
    }
    return 0;
}
DWORD WINAPI myfun2(LPVOID lpParameter)         //线程函数2
{
    while(1)
    {
        EnterCriticalSection(&Section);        //进入临界区
        a1++;
        if(a1<10000)
        {
            //::Sleep(1000);                            //程序睡眠1秒
            printf("线程2正在计数%d\r\n",a1);
            LeaveCriticalSection(&Section);                //离开临界区
        }
        else
        {
            LeaveCriticalSection(&Section);            
            break;
        }
    }
    return 0;                                    //线程函数返回0
}

 

输出

线程2正在计数9702
线程2正在计数9703
线程2正在计数9704
线程2正在计数9705
线程2正在计数9706
线程2正在计数9707
线程2正在计数9708
线程2正在计数9709
线程2正在计数9710
线程2正在计数9711
线程2正在计数9712
线程2正在计数9713
线程2正在计数9714
线程2正在计数9715
线程2正在计数9716
线程2正在计数9717
线程2正在计数9718
线程2正在计数9719
线程1正在计数9720
线程1正在计数9721
线程1正在计数9722
线程1正在计数9723
线程1正在计数9724
线程1正在计数9725
线程1正在计数9726
线程1正在计数9727
线程1正在计数9728
线程1正在计数9729
线程1正在计数9730
线程1正在计数9731
线程1正在计数9732
线程1正在计数9733
线程1正在计数9734
线程1正在计数9735
线程1正在计数9736
线程1正在计数9737
线程1正在计数9738
线程1正在计数9739
线程1正在计数9740
线程1正在计数9741
线程1正在计数9742
线程1正在计数9743
线程1正在计数9744
线程1正在计数9745
线程1正在计数9746
线程1正在计数9747
线程1正在计数9748
线程1正在计数9749
线程1正在计数9750
线程1正在计数9751
线程1正在计数9752
线程1正在计数9753
线程1正在计数9754
线程2正在计数9755
线程2正在计数9756
线程2正在计数9757
线程2正在计数9758
线程2正在计数9759
线程2正在计数9760
线程2正在计数9761
线程2正在计数9762
线程2正在计数9763
线程2正在计数9764
线程2正在计数9765
线程2正在计数9766
线程2正在计数9767
线程2正在计数9768
线程2正在计数9769
线程2正在计数9770
线程2正在计数9771
线程2正在计数9772
线程2正在计数9773
线程2正在计数9774
线程2正在计数9775
线程2正在计数9776
线程2正在计数9777
线程2正在计数9778
线程2正在计数9779
线程2正在计数9780
线程2正在计数9781
线程2正在计数9782
线程2正在计数9783
线程2正在计数9784
线程2正在计数9785
线程2正在计数9786
线程2正在计数9787
线程2正在计数9788
线程2正在计数9789
线程1正在计数9790
线程1正在计数9791
线程1正在计数9792
线程1正在计数9793
线程1正在计数9794
线程1正在计数9795
线程1正在计数9796
线程1正在计数9797
线程1正在计数9798
线程1正在计数9799
线程1正在计数9800
线程1正在计数9801
线程1正在计数9802
线程1正在计数9803
线程1正在计数9804
线程1正在计数9805
线程1正在计数9806
线程1正在计数9807
线程1正在计数9808
线程1正在计数9809
线程1正在计数9810
线程1正在计数9811
线程1正在计数9812
线程1正在计数9813
线程1正在计数9814
线程1正在计数9815
线程1正在计数9816
线程1正在计数9817
线程1正在计数9818
线程1正在计数9819
线程1正在计数9820
线程1正在计数9821
线程1正在计数9822
线程1正在计数9823
线程1正在计数9824
线程2正在计数9825
线程2正在计数9826
线程2正在计数9827
线程2正在计数9828
线程2正在计数9829
线程2正在计数9830
线程2正在计数9831
线程2正在计数9832
线程2正在计数9833
线程2正在计数9834
线程2正在计数9835
线程2正在计数9836
线程2正在计数9837
线程2正在计数9838
线程2正在计数9839
线程2正在计数9840
线程2正在计数9841
线程2正在计数9842
线程2正在计数9843
线程2正在计数9844
线程2正在计数9845
线程2正在计数9846
线程2正在计数9847
线程2正在计数9848
线程2正在计数9849
线程2正在计数9850
线程2正在计数9851
线程2正在计数9852
线程2正在计数9853
线程2正在计数9854
线程2正在计数9855
线程2正在计数9856
线程2正在计数9857
线程2正在计数9858
线程2正在计数9859
线程1正在计数9860
线程1正在计数9861
线程1正在计数9862
线程1正在计数9863
线程1正在计数9864
线程1正在计数9865
线程1正在计数9866
线程1正在计数9867
线程1正在计数9868
线程1正在计数9869
线程1正在计数9870
线程1正在计数9871
线程1正在计数9872
线程1正在计数9873
线程1正在计数9874
线程1正在计数9875
线程1正在计数9876
线程1正在计数9877
线程1正在计数9878
线程1正在计数9879
线程1正在计数9880
线程1正在计数9881
线程1正在计数9882
线程1正在计数9883
线程1正在计数9884
线程1正在计数9885
线程1正在计数9886
线程1正在计数9887
线程1正在计数9888
线程1正在计数9889
线程1正在计数9890
线程1正在计数9891
线程1正在计数9892
线程1正在计数9893
线程1正在计数9894
线程2正在计数9895
线程2正在计数9896
线程2正在计数9897
线程2正在计数9898
线程2正在计数9899
线程2正在计数9900
线程2正在计数9901
线程2正在计数9902
线程2正在计数9903
线程2正在计数9904
线程2正在计数9905
线程2正在计数9906
线程2正在计数9907
线程2正在计数9908
线程2正在计数9909
线程2正在计数9910
线程2正在计数9911
线程2正在计数9912
线程2正在计数9913
线程2正在计数9914
线程2正在计数9915
线程2正在计数9916
线程2正在计数9917
线程2正在计数9918
线程2正在计数9919
线程2正在计数9920
线程2正在计数9921
线程2正在计数9922
线程2正在计数9923
线程2正在计数9924
线程2正在计数9925
线程2正在计数9926
线程2正在计数9927
线程2正在计数9928
线程2正在计数9929
线程1正在计数9930
线程1正在计数9931
线程1正在计数9932
线程1正在计数9933
线程1正在计数9934
线程1正在计数9935
线程1正在计数9936
线程1正在计数9937
线程1正在计数9938
线程1正在计数9939
线程1正在计数9940
线程1正在计数9941
线程1正在计数9942
线程1正在计数9943
线程1正在计数9944
线程1正在计数9945
线程1正在计数9946
线程1正在计数9947
线程1正在计数9948
线程1正在计数9949
线程1正在计数9950
线程1正在计数9951
线程1正在计数9952
线程1正在计数9953
线程1正在计数9954
线程1正在计数9955
线程1正在计数9956
线程1正在计数9957
线程1正在计数9958
线程1正在计数9959
线程1正在计数9960
线程1正在计数9961
线程1正在计数9962
线程1正在计数9963
线程1正在计数9964
线程2正在计数9965
线程2正在计数9966
线程2正在计数9967
线程2正在计数9968
线程2正在计数9969
线程2正在计数9970
线程2正在计数9971
线程2正在计数9972
线程2正在计数9973
线程2正在计数9974
线程2正在计数9975
线程2正在计数9976
线程2正在计数9977
线程2正在计数9978
线程2正在计数9979
线程2正在计数9980
线程2正在计数9981
线程2正在计数9982
线程2正在计数9983
线程2正在计数9984
线程2正在计数9985
线程2正在计数9986
线程2正在计数9987
线程2正在计数9988
线程2正在计数9989
线程2正在计数9990
线程2正在计数9991
线程2正在计数9992
线程2正在计数9993
线程2正在计数9994
线程2正在计数9995
线程2正在计数9996
线程2正在计数9997
线程2正在计数9998
线程2正在计数9999
正常退出程序请按'q'
 

程序中 用户首先声明临界区对象Section和两个线程函数myfun1()和myfun2()
然后在主函数创建两个线程
h1和h2
主线程函数InitializeCriticalSection()初始化临界区对象并通过函数Sleep()暂停10秒

输出结果看到
线程1和2函数交替执行输出结果并且变量a1的值按照顺序增加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值