线程生产者与消费者

发布时间 2023-05-24 15:38:08作者: leochan007
// testmutex.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>


#include "windows.h"
HANDLE m_hMutex;
#include<list>

using namespace std;
list<int> vecInt;
DWORD WINAPI ThreadFunc1(LPVOID lpParam)
{
    while (1)
    {
     //   printf("线程等待锁1\n");
        int a = -1;
        DWORD dwRet = GetLastError();
        if (0 != dwRet)
        {
            printf("线程结束1::%d\n",dwRet);
            break;
        }
        WaitForSingleObject(m_hMutex, INFINITE);
        if (vecInt.size()>0)
        {
            a = vecInt.front();
            vecInt.pop_front();
            printf("ThreadFunc1::%d\n", a);
        }
 
        ReleaseMutex(m_hMutex);
        
       

    }
    Sleep(5000);
    printf("1线程结束\n");
    return 0;
}
DWORD WINAPI ThreadFunc2(LPVOID lpParam)
{
    while (1)
    {
        printf("线程等待锁2\n");
        WaitForSingleObject(m_hMutex, INFINITE);
        for (int i = 1; i < 20; i++)
        {
            vecInt.push_back(i);
        }
        printf("ThreadFunc2::%d\n",vecInt.size());

        ReleaseMutex(m_hMutex);
        Sleep(10000);

    }
    Sleep(5000);
    printf("线程结束\n");
    return 0;
}
int main(int argc, char* argv[])
{
    DWORD nStatus = 0;
    
    m_hMutex = CreateMutex(NULL, FALSE, L"cplusplus_me");
    DWORD dwRet = GetLastError();
    if (m_hMutex)
    {
        if (ERROR_ALREADY_EXISTS == dwRet)
        {
            printf("程序已经在运行中了,程序退出!\n");
            WaitForSingleObject(m_hMutex, INFINITE);
            //   CloseHandle(m_hMutex);
         //   return 0;
        }
    }
    //else
    //{
    //    printf("创建互斥量错误,程序退出!\n");
    //    CloseHandle(m_hMutex);
    //    return 0;
    //}
 //   ReleaseMutex(m_hMutex);
    HANDLE handle = ::CreateThread(NULL, 0, ThreadFunc1,NULL,1024,&nStatus);
  //  ::CreateThread(NULL, 0, ThreadFunc2, NULL, 1024, &nStatus);
    for(int i =0;i<5;i++)
    {
        DWORD dwRet = GetLastError();
        if (0 != dwRet) break;

        printf("线程等待锁2\n");
        WaitForSingleObject(m_hMutex, INFINITE);
        for (int i = 1; i < 20; i++)
        {
            vecInt.push_back(i);
        }
        printf("ThreadFunc2::%d\n", vecInt.size());

        ReleaseMutex(m_hMutex);
        Sleep(1000);
        
    }
    CloseHandle(m_hMutex);
    WaitForSingleObject(handle,INFINITE);
    printf("end\n");
    getchar();
    return 0;
}