zoukankan      html  css  js  c++  java
  • C++线程同步之临界区

    #include <iostream>
    #include <windows.h>
    using namespace std;
    
    CRITICAL_SECTION cs;
    
    // LockCount 它被初始化为数值 -1,此数值等于或大于 0 时,表示此临界区被占用;等待获得临界区的线程数:LockCount - (RecursionCount -1)        
    // RecursionCount 此字段包含所有者线程已经获得该临界区的次数
    // OwningThread 此字段包含当前占用此临界区的线程的线程标识符,此线程 ID 与GetCurrentThreadId 所返回的 ID 相同
    
    
    
    DWORD WINAPI ThreadProc1(LPVOID lpParameter)
    {
        for (int x = 0; x < 1000; x++)
        {
            EnterCriticalSection(&cs);
            Sleep(1000);
            printf("11111:%x %x %x
    ", cs.LockCount, cs.RecursionCount, cs.OwningThread);
            LeaveCriticalSection(&cs);
        }
        return 0;
    }
    
    DWORD WINAPI ThreadProc2(LPVOID lpParameter)
    {
        for (int x = 0; x < 1000; x++)
        {
            EnterCriticalSection(&cs);
            Sleep(1000);
            printf("22222:%x %x %x
    ", cs.LockCount, cs.RecursionCount, cs.OwningThread);
            LeaveCriticalSection(&cs);
        }
        return 0;
    }
    
    DWORD WINAPI ThreadProc3(LPVOID lpParameter)
    {
        for (int x = 0; x < 1000; x++)
        {
            EnterCriticalSection(&cs);
            Sleep(1000);
            printf("33333:%x %x %x
    ", cs.LockCount, cs.RecursionCount, cs.OwningThread);
            LeaveCriticalSection(&cs);
        }
        return 0;
    }
    
    DWORD WINAPI ThreadProc4(LPVOID lpParameter)
    {
        for (int x = 0; x < 1000; x++)
        {
            EnterCriticalSection(&cs);
            Sleep(1000);
            printf("44444:%x %x %x
    ", cs.LockCount, cs.RecursionCount, cs.OwningThread);
            LeaveCriticalSection(&cs);
        }
        return 0;
    }
    
    int main()
    {
        // 初始化临界区
        InitializeCriticalSection(&cs);
        // printf("%x %x %x", cs.LockCount, cs.RecursionCount, cs.OwningThread);
        // 创建一个新的线程
        HANDLE hTread1 = CreateThread(0, 0, ThreadProc1, 0, 0, 0);
        // 创建一个新的线程
        HANDLE hTread2 = CreateThread(0, 0, ThreadProc2, 0, 0, 0);
        // 创建一个新的线程
        HANDLE hTread3 = CreateThread(0, 0, ThreadProc3, 0, 0, 0);
        // 创建一个新的线程
        HANDLE hTread4 = CreateThread(0, 0, ThreadProc4, 0, 0, 0);
        // 如果不在其它的地方引用它就关闭句柄
        ::CloseHandle(hTread1);
        ::CloseHandle(hTread2);
        ::CloseHandle(hTread3);
        ::CloseHandle(hTread4);
        // 销毁临界区
        // DeleteCriticalSection(&cs);
        getchar();
        return 0;
    }
  • 相关阅读:
    JVM调优方法笔记
    JVM调优方法笔记
    JavaScript实现选择排序
    自动安装带nginx_upstream_check_module模块的Nginx脚本
    自动安装带nginx_upstream_check_module模块的Nginx脚本
    自动安装带nginx_upstream_check_module模块的Nginx脚本
    简单的文件上传html+ashx
    【转】建构修正版 Casper 协议
    【转】为什么去中心化兑换协议很重要
    【转】当我们说“区块链是无需信任的”,我们的意思是
  • 原文地址:https://www.cnblogs.com/duxie/p/11110231.html
Copyright © 2011-2022 走看看