• windows下线程同步【WaitForSingleObject、WaitForMultipleObjects、CRITICAL_SECTION(用户模式)、互斥量(内核模式)、信号量(内核模式)、事件对象(内核模式)】


    WaitForSingleObject函数的使用

    #include <stdio.h>
    #include <windows.h>
    #include <process.h>
    unsigned WINAPI ThreadFunc(void *arg); int main(int argc, char *argv[]) { HANDLE hThread; DWORD wr; unsigned threadID; int param = 5; hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void *)&param, 0, &threadID); if((wr = WaitForSingleObject(hThread, INFINITE)) == WAIT_FAILED) { puts("thread wait error"); return -1; } printf("wait result: %s ", (wr == WAIT_OBJECT_0) ? "signaled" : "time-out"); puts("end of main"); return 0; } unsigned WINAPI ThreadFunc(void *arg) { int i; int cnt = *((int *)arg); for(i = 0; i < cnt; i ++) { Sleep(1000); puts("running thread"); } return 0; }

    WaitForMultipleObjects函数的使用(这个不会产生正确的结果)

    #include <stdio.h>
    #include <windows.h>
    #include <process.h>
    #define NUM_THREAD 50
    unsigned WINAPI threadInc(void *arg);
    unsigned WINAPI threadDec(void *arg);
    long long num = 0;
    int main(int argc, char *argv[])
    {
        HANDLE  tHandles[NUM_THREAD];
        int i;
        printf("sizeof long long: %d 
    ", sizeof(long long));
        for(i = 0; i < NUM_THREAD; i ++)
        {
            if(i % 2)
                tHandles[i] = (HANDLE)_beginthreadex(NULL, 0, threadInc, NULL, 0, NULL);
            else
                tHandles[i] = (HANDLE)_beginthreadex(NULL, 0, threadDec, NULL, 0, NULL);
        }
        WaitForMultipleObjects(NUM_THREAD, tHandles, TRUE, INFINITE);
        printf("result: %lld 
    ", num);
        return 0;
    }
    unsigned WINAPI threadInc(void *arg)
    {
        int i;
        for(i = 0; i < 50000000; i ++)
            num += 1;
        return 0;
    }
    unsigned WINAPI threadDec(void *arg)
    {
        int i;
        for(i = 0; i < 50000000; i ++)
            num -= 1;
        return 0;
    }

    CRITICAL_SECTION的使用

    #include <stdio.h>
    #include <windows.h>
    #include <process.h>
    #define NUM_THREAD 50
    unsigned WINAPI threadInc(void *arg);
    unsigned WINAPI threadDec(void *arg);
    long long num = 0;
    CRITICAL_SECTION cs;
    int main(int argc, char *argv[])
    {
        HANDLE  tHandles[NUM_THREAD];
        int i;
        InitializeCriticalSection(&cs);
        for(i = 0; i < NUM_THREAD; i ++)
        {
            if(i % 2)
                tHandles[i] = (HANDLE)_beginthreadex(NULL, 0, threadInc, NULL, 0, NULL);
            else
                tHandles[i] = (HANDLE)_beginthreadex(NULL, 0, threadDec, NULL, 0, NULL);
        }
        WaitForMultipleObjects(NUM_THREAD, tHandles, TRUE, INFINITE);
        DeleteCriticalSection(&cs);
        printf("result: %lld 
    ", num);
        return 0;
    }
    unsigned WINAPI threadInc(void *arg)
    {
        int i;
        EnterCriticalSection(&cs);
        for(i = 0; i < 50000000; i ++)
            num += 1;
        LeaveCriticalSection(&cs);
        return 0;
    }
    unsigned WINAPI threadDec(void *arg)
    {
        int i;
        EnterCriticalSection(&cs);
        for(i = 0; i < 50000000; i ++)
            num -= 1;
        LeaveCriticalSection(&cs);
        return 0;
    }

    基于互斥量的同步

    #include <stdio.h>
    #include <windows.h>
    #include <process.h>
    
    #define NUM_THREAD 50
    unsigned WINAPI threadInc(void *arg);
    unsigned WINAPI threadDec(void *arg);
    
    long long num = 0;
    HANDLE hMutex;
    
    int main(int argc, char *argv[])
    {
        HANDLE  tHandles[NUM_THREAD];
        int i;
    
        hMutex = CreateMutex(NULL, FALSE, NULL);
        for(i = 0; i < NUM_THREAD; i ++)
        {
            if(i % 2)
                tHandles[i] = (HANDLE)_beginthreadex(NULL, 0, threadInc, NULL, 0, NULL);
            else
                tHandles[i] = (HANDLE)_beginthreadex(NULL, 0, threadDec, NULL, 0, NULL);
        }
    
        WaitForMultipleObjects(NUM_THREAD, tHandles, TRUE, INFINITE);
        CloseHandle(hMutex);
        printf("result: %lld 
    ", num);
        return 0;
    }
    
    unsigned WINAPI threadInc(void *arg)
    {
        int i;
        WaitForSingleObject(hMutex, INFINITE);
        for(i = 0; i < 50000000; i ++)
            num += 1;
        ReleaseMutex(hMutex);
        return 0;
    }
    
    unsigned WINAPI threadDec(void *arg)
    {
        int i;
        WaitForSingleObject(hMutex, INFINITE);
        for(i = 0; i < 50000000; i ++)
            num -= 1;
        ReleaseMutex(hMutex);
        return 0;
    }

    基于信号量的同步

    #include <stdio.h>
    #include <windows.h>
    #include <process.h>
    
    unsigned WINAPI Read(void *arg);
    unsigned WINAPI Accu(void *arg);
    
    static HANDLE semOne;
    static HANDLE semTwo;
    static int num;
    
    int main(int argc, char *argv[])
    {
        HANDLE  hThread1, hThread2;
        semOne = CreateSemaphore(NULL, 0, 1, NULL);
        semTwo = CreateSemaphore(NULL, 1, 1, NULL);
    
        hThread1 = (HANDLE)_beginthreadex(NULL, 0, Read, NULL, 0, NULL);
        hThread2 = (HANDLE)_beginthreadex(NULL, 0, Accu, NULL, 0, NULL);
    
        WaitForSingleObject(hThread1, INFINITE);
        WaitForSingleObject(hThread2, INFINITE);
    
        CloseHandle(semOne);
        CloseHandle(semTwo);
        return 0;
    }
    
    unsigned WINAPI Read(void *arg)
    {
        int i;
        for(i = 0; i < 5; i ++)
        {
            fputs("Input num: ", stdout);
            WaitForSingleObject(semTwo, INFINITE);
            scanf("%d", &num);
            ReleaseSemaphore(semOne, 1, NULL);
        }
        return 0;
    }
    
    unsigned WINAPI Accu(void *arg)
    {
        int sum = 0, i;
        for(i = 0; i < 5; i ++)
        {
            WaitForSingleObject(semOne, INFINITE);
            sum += num;
            ReleaseSemaphore(semTwo, 1, NULL);
        }
        printf("Result: %d 
    ", sum);
        return 0;
    }

    基于事件对象的同步

    #include <stdio.h>
    #include <windows.h>
    #include <process.h>
    #define STR_LEN 100
    
    unsigned WINAPI NumberOfA(void *arg);
    unsigned WINAPI NumberOfOthers(void *arg);
    
    static char str[STR_LEN];
    static HANDLE hEvent;
    
    int main(int argc, char *argv[])
    {
        HANDLE  hThread1, hThread2;
        hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        hThread1 = (HANDLE)_beginthreadex(NULL, 0, NumberOfA, NULL, 0, NULL);
        hThread2 = (HANDLE)_beginthreadex(NULL, 0, NumberOfOthers, NULL, 0, NULL);
    
        fputs("Input string: ", stdout);
        fgets(str, STR_LEN, stdin);
        SetEvent(hEvent);
    
        WaitForSingleObject(hThread1, INFINITE);
        WaitForSingleObject(hThread2, INFINITE);
        ResetEvent(hEvent);
        CloseHandle(hEvent);
        return 0;
    }
    
    unsigned WINAPI NumberOfA(void *arg)
    {
        int i, cnt = 0;
        WaitForSingleObject(hEvent, INFINITE);
        for(i = 0; str[i] != 0; i ++)
        {
            if(str[i] == 'A')
                cnt ++;
        }
        printf("num of A: %d 
    ", cnt);
        return 0;
    }
    
    unsigned WINAPI NumberOfOthers(void *arg)
    {
        int i, cnt = 0;
        WaitForSingleObject(hEvent, INFINITE);
        for(i = 0; str[i] != 0; i ++)
        {
            if(str[i] != 'A')
                cnt ++;
        }
        printf("Number of others: %d 
    ", cnt - 1);
        return 0;
    }
    

      

  • 相关阅读:
    空间距离计算
    一种支持多种并行环境的栅格地理计算并行算子
    发布或重启线上服务时抖动问题解决方案
    jetty9优化的两处地方
    mysql空间扩展 VS PostGIS
    多流向算法GPU并行化
    GDAL并行I/O
    深入浅出空间索引:2
    深入浅出空间索引:为什么需要空间索引
    virtualBox中的centOS虚拟机硬盘扩容
  • 原文地址:https://www.cnblogs.com/wisdomroc/p/11842685.html
Copyright © 2020-2023  润新知