实现一个队列 【微软面试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;

}

 

你可能感兴趣的:(面试)