zoukankan      html  css  js  c++  java
  • C++线程同步之事件(生产者与消费者问题)

    #include <windows.h>
    #include <stdio.h>
    
    HANDLE g_hSet = NULL;
    HANDLE g_hClear = NULL;
    HANDLE hThread[2] = { NULL };
    int g_Max = 10;
    int g_Number = 0;
    
    // 生产者线程
    DWORD WINAPI ThreadProc1(LPVOID lpParameter)
    {
        for (int i = 0; i < g_Max; i++)
        {
            WaitForSingleObject(g_hSet, INFINITE);
            g_Number = 1;
            DWORD id = GetCurrentThreadId();
            printf("生产者%d将数据%d放入缓冲区!
    ", id, g_Number);
            SetEvent(g_hClear);
        }
        return 0;
    }
    
    // 消费者线程
    DWORD WINAPI ThreadProc2(LPVOID lpParameter)
    {
        for (int i = 0; i < g_Max; i++)
        {
            WaitForSingleObject(g_hClear, INFINITE);
            g_Number = 0;
            DWORD id = GetCurrentThreadId();
            printf("---消费者%d将数据%d放入缓冲区!
    ", id, g_Number);
            SetEvent(g_hSet);
        }
        return 0;
    }
    
    int main()
    {
        g_hSet = ::CreateEvent(NULL, FALSE, TRUE, NULL);
        g_hClear = ::CreateEvent(NULL, FALSE, FALSE, NULL);
        hThread[0] = CreateThread(0, 0, ThreadProc1, 0, 0, 0);
        hThread[1] = CreateThread(0, 0, ThreadProc2, 0, 0, 0);
        WaitForMultipleObjects(2, hThread, TRUE, -1);
        CloseHandle(hThread[0]);
        CloseHandle(hThread[1]);
        CloseHandle(g_hClear);
        CloseHandle(g_hSet);
        getchar();
        return 0;
    }

    临界区与互斥体是不能解决线程同步问题的,只能解决互斥问题,但是事件既可以解决互斥问题,又可以解决线程同步问题。

  • 相关阅读:
    16. 3Sum Closest
    17. Letter Combinations of a Phone Number
    20. Valid Parentheses
    77. Combinations
    80. Remove Duplicates from Sorted Array II
    82. Remove Duplicates from Sorted List II
    88. Merge Sorted Array
    257. Binary Tree Paths
    225. Implement Stack using Queues
    113. Path Sum II
  • 原文地址:https://www.cnblogs.com/duxie/p/11123301.html
Copyright © 2011-2022 走看看