⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档 (2).txt

📁 操作系统的程序 和代码算法编程 操作系统的程序 和代码算法编程
💻 TXT
字号:
#include <windows.h>
#include <iostream>

const unsigned short SIZE_OF_BUFFER = 10; //?????
unsigned short ProductID = 0;    //???
unsigned short ConsumeID = 0;    //????????
unsigned short in = 0;      //?????????????
unsigned short out = 0;      //?????????????

int g_buffer[SIZE_OF_BUFFER];    //?????????
bool g_continue = true;      //??????
HANDLE g_hMutex;       //????????
HANDLE g_hFullSemaphore;     //?????????????
HANDLE g_hEmptySemaphore;     //?????????????

DWORD WINAPI Producer(LPVOID);    //?????
DWORD WINAPI Consumer(LPVOID);    //?????

int main()
{
    //????????
    g_hMutex = CreateMutex(NULL,FALSE,NULL);
    g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);
    g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);

    //???????,????,??????????????,
    //?????,??????????;??,??????? 
    const unsigned short PRODUCERS_COUNT = 3;  //??????
    const unsigned short CONSUMERS_COUNT = 1;  //??????

    //?????
    const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;

    HANDLE hThreads[PRODUCERS_COUNT]; //????handle
    DWORD producerID[CONSUMERS_COUNT]; //?????????
    DWORD consumerID[THREADS_COUNT]; //?????????

    //???????
    for (int k=0;k<PRODUCERS_COUNT;++k)
	{
        hThreads[k]=CreateThread(NULL,0,Producer,NULL,0,&producerID[k]);
        if (hThreads[k]==NULL) return -1;
    }
    //???????
    for (int i=0;i<CONSUMERS_COUNT;++i){
        hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);
        if (hThreads[i]==NULL) return -1;
    }

    while(g_continue){
        if(getchar()){ //??????????
            g_continue = false;
        }
    }

    return 0;
}

//??????????????,???????ID?
void Produce()
{
    std::cerr << "Producing " << ++ProductID << " ... ";
    std::cerr << "Succeed" << std::endl;
}

//????????????
void Append()
{
    std::cerr << "Appending a product ... ";
    g_buffer[in] = ProductID;
    in = (in+1)%SIZE_OF_BUFFER;
    std::cerr << "Succeed" << std::endl;

    //??????????
    for (int i=0;i<SIZE_OF_BUFFER;++i){
        std::cout << i <<": " << g_buffer[i];
        if (i==in) std::cout << " <-- ??";
        if (i==out) std::cout << " <-- ??";
        std::cout << std::endl;
    }
}

//???????????
void Take()
{
    std::cerr << "Taking a product ... ";
    ConsumeID = g_buffer[out];
    out = (out+1)%SIZE_OF_BUFFER;
    std::cerr << "Succeed" << std::endl;

    //??????????
    for (int i=0;i<SIZE_OF_BUFFER;++i){
        std::cout << i <<": " << g_buffer[i];
        if (i==in) std::cout << " <-- ??";
        if (i==out) std::cout << " <-- ??";
        std::cout << std::endl;
    }
}

//??????
void Consume()
{
    std::cerr << "Consuming " << ConsumeID << " ... ";
    std::cerr << "Succeed" << std::endl;
}

//???
DWORD  WINAPI Producer(LPVOID lpPara)
{
    while(g_continue){
        WaitForSingleObject(g_hFullSemaphore,INFINITE);
        WaitForSingleObject(g_hMutex,INFINITE);
        Produce();
        Append();
        Sleep(1500);
        ReleaseMutex(g_hMutex);
        ReleaseSemaphore(g_hEmptySemaphore,1,NULL);
    }
    return 0;
}

//???
DWORD  WINAPI Consumer(LPVOID lpPara)
{
    while(g_continue){
        WaitForSingleObject(g_hEmptySemaphore,INFINITE);
        WaitForSingleObject(g_hMutex,INFINITE);
        Take();
        Consume();
        Sleep(1500);
        ReleaseMutex(g_hMutex);
        ReleaseSemaphore(g_hFullSemaphore,1,NULL);
    }
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -