zoukankan      html  css  js  c++  java
  • 实现一个队列 【微软面试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;
    }
  • 相关阅读:
    读写二进制c# 二进制读写
    重构风险程序员一定要遵守的规则
    文件区域使用fcntl锁定文件,并且测试
    数据清空js清空div里的数据问题
    模板缓存ThinkPHP中的模板引擎和视图层
    描述null11121 Base 2
    操作系统请求操作系统 算法
    工程项目eclipse项目名前出现红色感叹号,小红叉解决
    程序链接关于静态链接,动态链接,共享库,ABI的一些记录(os学习)
    NMAKE命令行编译
  • 原文地址:https://www.cnblogs.com/tractorman/p/4064199.html
Copyright © 2011-2022 走看看