多进程

大憨熊 提交于 2019-11-30 09:28:17

 

 

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include<fstream>  //ifstream


using namespace std;

HANDLE Empty, Full, Mutex; //声明3个信号量,mutex为互斥信号量,剩下的为同步信号量,同事同步信号量也起到计数器的作用 句柄类型
int x = 0;
int y = 0;
ofstream outf;


DWORD WINAPI produce(LPVOID param)
{
    int j = 0;
    do
    {
        WaitForSingleObject(Empty, INFINITE);//P(Empty)
        WaitForSingleObject(Mutex, INFINITE);//P(Mutex),形成互斥,生产者、消费者,生产者、生产者;只能一个人占用这个资源
        //cout << "produce, ";
        printf("produce,\n");
        outf<<"produce,\n";
        j++;
        ReleaseSemaphore(Mutex, 1, NULL);//V(Mutex),取消互斥,允许其他线程生产,占用此互斥资源
        ReleaseSemaphore(Full, 1, NULL);//V(Full),放一个物品到货架,可以消费量+1
    }
    while (j != 2);  //每个线程生产200次
    return 0;
}
DWORD WINAPI consume(LPVOID param)
{
    int j = 0;
    do
    {
        WaitForSingleObject(Full, INFINITE);//P(Full),将可以消费量-1
        WaitForSingleObject(Mutex, INFINITE);//P(Mutex),形成互斥访问,消费者、生产者,消费者、消费者;只能一个人占用这个资源
        //cout << "consume, ";
        printf("consume,\n");
        outf<<"consume,\n";
        j++;
        ReleaseSemaphore(Mutex, 1, NULL);//V(Mutex),取消互斥,允许其他线程消费
        ReleaseSemaphore(Empty, 1, NULL);//V(Empty)
    }
    while (j != 2);  //每个线程可以消费200次
    return 0;
}


int main()
{
    int i;
    Empty = CreateSemaphore(NULL, 20, 20, NULL);//声明同步信号量,初始值为20 最大值20
    Full = CreateSemaphore(NULL, 0, 20, NULL);//声明同步信号量,初始值0
    Mutex = CreateSemaphore(NULL, 1, 1, NULL);//互斥信号量,初始值为1
    outf.open("C:\\out.txt");//需要写入的文本文件
    DWORD* ThreadId = (DWORD*)malloc(20 * sizeof(DWORD*));
    HANDLE* ThreadHandle = (HANDLE*)malloc(20 * sizeof(HANDLE));//创建线程句柄并分配内存空间
    //创建10个生产者进程和消费者进程
    for (i = 0; i < 10; i++)
    {
        ThreadHandle[i] = CreateThread(NULL, 0, produce, NULL, 0, &ThreadId[i]);
        //ThreadHandle[i + 10] = CreateThread(NULL, 0, consume, NULL, 0, &ThreadId[i + 10]);
    }
    for (i = 0; i < 10; i++)
    {
        ThreadHandle[i + 10] = CreateThread(NULL, 0, consume, NULL, 0, &ThreadId[i + 10]);
    }
    Sleep(1000);
    return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!