实现一个队列 【微软面试100题 第三十四题】

题目要求:

  实现一个队列。队列的应用场景是:一个生产者线程将int型的数入列,一个消费者线程将int型的数出列。

  参考资料: 编程之美1.10

题目分析:

  可以按照操作系统中的生产者与消费者模型来实现代码,大致思路如下:

void producer(void)
{
    while(1)
    {
        item = produce_item();
        down(empty);//信号量
        down(mutex);//互斥量
        q.push(item);//队列压栈
        up(mutex);
        up(full);
    }
}
void consumer(void)
{
    while(1)
    {
        down(full);
        down(mutex);
        item = remove_item();
        up(mutex);
        up(empty);
        q.pop(item);//队列出栈
    }
}

代码实现:

  转自:http://blog.csdn.net/yuucyf/article/details/6717135,思路与上面的分析有些不同,可以参考代码和调试来理解。

/*-----------------------------
Copyright by yuucyf. 2011.08.25
-------------------------------*/
#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <iostream>
#include <queue>
using namespace std;

HANDLE g_hSemaphore = NULL;        //信号量
const int g_i32PMax = 100;        //生产(消费)总数
std::queue<int> g_queuePV;        //生产入队,消费出队


//生产者线程
unsigned int __stdcall ProducerThread(void* pParam)
{
    int i32N = 0;
    while (++i32N <= g_i32PMax)
    {
        //生产
        g_queuePV.push(i32N);
        cout<<"Produce "<< i32N << endl;
        ReleaseSemaphore(g_hSemaphore, 1, NULL); //增加信号量
        Sleep(300);//生产间隔的时间,可以和消费间隔时间一起调节
    }

    return 0;
}

//消费者线程
unsigned int __stdcall CustomerThread(void* pParam)
{
    int i32N = g_i32PMax;
    while (i32N--)
    {
        WaitForSingleObject(g_hSemaphore, 10000);
        //消费
        queue <int>::size_type iVal = g_queuePV.front();
        g_queuePV.pop();
        cout<<"Custom "<< iVal << endl;
        Sleep(500);    //消费间隔的时间,可以和生产间隔时间一起调节
    }

    //消费结束
    cout << "Working end." << endl;

    return 0;
}

void PVOperationGo()
{
    g_hSemaphore = CreateSemaphore(NULL, 0, g_i32PMax, NULL); //信号量来维护线程同步
    if (NULL == g_hSemaphore)
        return;

    cout <<"Working start..." <<endl;
    HANDLE aryhPV[2];
    aryhPV[0] = (HANDLE)_beginthreadex(NULL, 0, ProducerThread, NULL, 0, NULL);
    aryhPV[1] = (HANDLE)_beginthreadex(NULL, 0, CustomerThread, NULL, 0, NULL);

    WaitForMultipleObjects(2, aryhPV, TRUE, INFINITE);
    CloseHandle(g_hSemaphore);
}

int main(void)
{
    PVOperationGo();

    return 0;
}
原文地址:https://www.cnblogs.com/tractorman/p/4064199.html