`
tinggo
  • 浏览: 44896 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Win32多线程学习之二(实现生产者与消费者模型)

 
阅读更多
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <process.h>
#include <time.h>
#include <list>
 
#define MUTEX(mutex) WaitForSingleObject(mutex, INFINITE);
#define RELEASE_MUTEX(mutex) ReleaseMutex(mutex);
 
#define P(sem) WaitForSingleObject(sem, INFINITE);
#define V(sem) ReleaseSemaphore(sem, 1, NULL);
 
#define CONSUMER_COUNT 10
#define PRODUCER_COUNT 5
 
HANDLE mutex;
HANDLE emptySem;
HANDLE fullSem;
::std::list<int> gList;
 
void initialize()
{
    mutex = CreateMutex(NULL, false, TEXT("mutex"));
    emptySem = CreateSemaphore(NULL, 0, 10, TEXT("empty"));
    fullSem = CreateSemaphore(NULL, 10, 10, TEXT("full"));
    srand((unsigned int)time(NULL));
}
 
int main()
{
    initialize();
    VOID ConsumerThread(VOID* );
    VOID ProducerThread(VOID* );
    for (int i = 0; i < PRODUCER_COUNT; ++i)
    {
        _beginthread(ProducerThread, 0, NULL);
    }
    for (int i = 0; i < CONSUMER_COUNT; ++i)
    {
       _beginthread(ConsumerThread, 0, NULL);
    }
    Sleep(3600*1000);
    return 0;
}
 
VOID ConsumerThread(VOID* argu)
{
    while(true)
    {
    P(emptySem);
    MUTEX(mutex);
    printf("Pop a random number %d\n", *gList.rbegin());
    gList.pop_back();
    RELEASE_MUTEX(mutex);
    V(fullSem);
    }
}
 
VOID ProducerThread(VOID* argu)
{
    while(true)
    {
    P(fullSem);
    MUTEX(mutex);
    int random = rand();
    gList.push_front(random);
    printf("Push a random number: %d\n", random);
    RELEASE_MUTEX(mutex);
    V(emptySem);
    }
}
分享到:
评论

相关推荐

    编写程序,运用Win32Api实现生产者与消费者使用缓冲区完成生产者与消费者的关系。模拟生产者和消费者的处理过程,程序中演示同步与互斥的关系。

    - 使用 Win32 API 和 C 语言来实现生产者与消费者模型。 - 通过一个共享缓冲区来协调生产者与消费者之间的交互。 - 展示同步与互斥机制如何在多线程环境下确保数据的一致性和完整性。 **具体实现思路:** 1. **初始...

    Win丨linux丨操作系统实验二:生产者——消费者问题

    1. 在Windows操作系统上,利用Win32 API提供的信号量机制,编写应用程序实现生产者——消费者问题。 2. 在Linux操作系统上,利用Pthread API提供的信号量机制,编写应用程序实现生产者——消费者问题。 3. 两种环境...

    生产者消费者演示程序

    通过对这个代码的分析和学习,我们可以更深入地理解多线程同步以及生产者消费者模式在实际应用中的实现方法。 总之,生产者消费者问题是多线程编程中的一个重要概念,它展示了如何通过同步机制来协调不同任务之间的...

    Qt实现串口通信(利用windows API实现串口枚举,多线程、生产者消费者模型实现数据解析)

    在本文中,我们将深入探讨如何使用Qt框架来实现串口通信,特别关注Windows API的使用、多线程以及生产者消费者模型在数据解析中的应用。首先,我们要理解Qt是一个跨平台的应用程序开发框架,它提供了丰富的图形用户...

    实验一 生产者消费者问题

    生产者消费者问题是多线程编程中的经典模型,用于展示如何在并发环境中协调生产者和消费者之间的数据处理。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了保证系统的稳定性和正确性,...

    Win32多线程程序设计

    - **生产者消费者模型**:解决多线程之间的数据交换问题,通常涉及队列结构。 - **读写锁**:允许多个读线程同时访问共享资源,但不允许写操作与其他任何操作并发。 - **信号量**:用于限制可以同时访问共享资源的...

    并发控制-生产者-消费者问题实验报告

    1. **并发模型构建**:需要实现N个生产者与M个消费者之间的并发控制,其中N、M均不得少于5,并且缓冲区大小不得小于5个元素。消息内容应为自定义的数据结构。 2. **多消费者模式**:设计中需考虑到单一生产者产生...

    操作系统实验报告-消费者生产者

    6. **程序设计与实现**:实验报告中会包含具体的程序设计和实现细节,如使用C、C++或Java等语言实现消费者和生产者的线程,以及如何通过系统调用来实现同步和互斥。 7. **测试与分析**:实验报告还会包括对程序的...

    操作系统生产者及消费者问题实验报告.doc

    实验容是使用生产者/消费者模型在 Windows 2000 环境下创立一个控制台进程,并在该进程中创立多个线程来模拟生产者和消费者,实现进程(线程)的同步与互斥。 实验要求包括: * 学习并理解生产者/消费者模型及其...

    基于C++实现生产者消费者问题(操作系统课程作业)【100012254】

    生产者消费者问题是多线程编程中的经典模型,用于展示并发控制和资源同步。在这个问题中,生产者线程负责创建产品并放入一个有限大小的缓冲区,而消费者线程则从缓冲区取出产品进行消费。当缓冲区满时,生产者必须...

    操作系统生产者与消费者问题实验报告.doc

    1. 实验内容以生产者/消费者模型为根据,在 Windows 2000 环境下创建一个控制台进程,在该进程中创建 n 个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。 2. 实验要求: ①学习并理解生产者/消费者模型...

    C++多线程编程入门小结

    - 对于复杂的应用场景,可以考虑使用更高级的并发模型,如生产者消费者模型、读写锁等。 通过以上介绍,我们可以了解到多线程编程的基本原理以及在C++中的具体实现方法。掌握这些知识点对于提升软件开发效率、优化...

    Sem.zip_SEM

    生产者-消费者问题是多线程编程中的一个经典模型,它涉及到两个类型的线程:生产者线程负责生产数据,而消费者线程则负责消费这些数据。在实际应用中,这可能表现为一个线程写入数据到缓冲区,另一个线程读取并处理...

    71113211魏远卓21

    在这个操作系统实验中,主要探讨了如何在Windows和Linux操作系统上使用多线程和信号量机制来解决经典的生产者-消费者问题。生产者-消费者问题是并发编程中的一个经典模型,它涉及多个线程之间的同步和互斥,以确保...

    57119101_王晨阳_ProducerConsumer1

    【Producer-Consumer问题】是经典的多线程同步问题,它涉及到如何在多个生产者和消费者之间共享有限资源的问题。在这个实验中,57119101_王晨阳_ProducerConsumer1通过Win32 API和Pthreads两种方式实现了这一问题的...

    qwaitcondition_win.rar_event

    `QWaitCondition`的一个常见应用场景是生产者-消费者模型。在这种模型中,生产者线程生成数据并将其放入队列,而消费者线程则从队列中取出数据处理。如果队列为空,消费者线程会等待条件变化(即队列有新的数据)。...

    A操作系统专业课程设计.doc

    本文档是关于A操作系统专业课程设计的一份详细报告,旨在通过实现一个生产者-消费者模型来理解和掌握多线程编程、MFC编程以及信号量机制的应用。该设计的目的是让学生深入理解操作系统中的并发控制和资源管理。 ...

Global site tag (gtag.js) - Google Analytics