Win32信号量实现生产者消费者模型

生产者消费者模型简介

        1.如果共享的buffer中有空位,则生产者生产产品,放到空位中;

        2.如果共享的buffer中有产品,则消费者消费产品;


使用win32简单实现 多生产者/多消费者 模型如下


#include <Windows.h>
#include <process.h>
#include <iostream>

using namespace std;
HANDLE hProducter;
HANDLE hConsumer;

int g_in = 0; // 初始生产产品的放置位置
int g_out = 0; // 初始消费产品的读取位置
const int MAX_NUM = 100;
int g_empty = MAX_NUM; // 初始空位数量
int g_full = 0;  // 初始产品数量
int g_products[MAX_NUM];

DWORD WINAPI Productor( LPVOID pParameter)
{
	int* pNo = static_cast<int*>(pParameter);

	while(1)
	{
		WaitForSingleObject(hProducter, INFINITE);
		if(g_empty > 0)
		{
			--g_empty;

			g_in %= MAX_NUM;
			g_products[g_in] = g_in;
			printf("produce id %d pos %d value %d\n", *pNo, g_in, g_products[g_in]);
			++g_in;

			++g_full;
		}
		ReleaseSemaphore(hProducter, 1, NULL);
		Sleep(1000);
	}

	return 1;
}

DWORD WINAPI Consumer( LPVOID pParameter)
{
	int* pNo = static_cast<int*>(pParameter);

	while(1)
	{
		WaitForSingleObject(hConsumer, INFINITE);
		if(g_full > 0)
		{
			--g_full;

			g_out %= MAX_NUM;
			printf("consume id %d pos %d value %d\n", *pNo, g_out, g_products[g_out]);
			++g_out;

			++g_empty;
		}
		ReleaseSemaphore(hConsumer, 1, NULL);
		Sleep(1000);
	}
	return 1;
}

int main()
{
	hProducter = CreateSemaphore(NULL, 1, 1, NULL);
	hConsumer = CreateSemaphore(NULL, 1, 1, NULL);

	int ProductorThreadIds[3];
	int ConsumerThreadIds[3];

	for(int i = 0; i < 3; ++i)
	{
		ConsumerThreadIds[i] = i+1;
		CreateThread(NULL, 0, Consumer, &ConsumerThreadIds[i], NULL, NULL);
	}

	for(int i = 0; i < 3; ++i)
	{
		ProductorThreadIds[i] = i+1;
		CreateThread(NULL, 0, Productor, &ProductorThreadIds[i], NULL, NULL);
	}

	Sleep(10000);
	return 0;
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用信号量实现生产者消费者问题的C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #define BUFFER_SIZE 5 // 缓冲池大小 #define PRODUCER_NUM 2 // 生产者数量 #define CONSUMER_NUM 3 // 消费者数量 #define ITEM_COUNT 20 // 生产/消费总数 int buffer[BUFFER_SIZE]; // 缓冲池 int in = 0; // 生产者写入位置 int out = 0; // 消费者读取位置 sem_t mutex; // 互斥信号量,保护缓冲池的访问 sem_t empty; // 空闲信号量,表示缓冲池空闲位置数量 sem_t full; // 满信号量,表示缓冲池已有数据数量 void* producer(void* arg) { int id = *(int*)arg; for (int i = 0; i < ITEM_COUNT; i++) { sem_wait(&empty); // 等待空闲空间 sem_wait(&mutex); // 互斥访问缓冲池 buffer[in] = i; printf("Producer %d: produced item %d at buffer[%d]\n", id, i, in); in = (in + 1) % BUFFER_SIZE; sem_post(&mutex); // 释放互斥信号量 sem_post(&full); // 发送满信号量 } return NULL; } void* consumer(void* arg) { int id = *(int*)arg; for (int i = 0; i < ITEM_COUNT / CONSUMER_NUM; i++) { sem_wait(&full); // 等待缓冲池有数据 sem_wait(&mutex); // 互斥访问缓冲池 int item = buffer[out]; printf("Consumer %d: consumed item %d at buffer[%d]\n", id, item, out); out = (out + 1) % BUFFER_SIZE; sem_post(&mutex); // 释放互斥信号量 sem_post(&empty); // 发送空闲信号量 } return NULL; } int main() { sem_init(&mutex, 0, 1); // 初始化互斥信号量 sem_init(&empty, 0, BUFFER_SIZE); // 初始化空闲信号量 sem_init(&full, 0, 0); // 初始化满信号量 pthread_t producers[PRODUCER_NUM]; pthread_t consumers[CONSUMER_NUM]; int producer_ids[PRODUCER_NUM]; int consumer_ids[CONSUMER_NUM]; for (int i = 0; i < PRODUCER_NUM; i++) { producer_ids[i] = i; pthread_create(&producers[i], NULL, producer, &producer_ids[i]); } for (int i = 0; i < CONSUMER_NUM; i++) { consumer_ids[i] = i; pthread_create(&consumers[i], NULL, consumer, &consumer_ids[i]); } for (int i = 0; i < PRODUCER_NUM; i++) { pthread_join(producers[i], NULL); } for (int i = 0; i < CONSUMER_NUM; i++) { pthread_join(consumers[i], NULL); } sem_destroy(&mutex); sem_destroy(&empty); sem_destroy(&full); return 0; } ``` 在这个程序中,我们使用了三个信号量:互斥信号量 `mutex` 用于保护缓冲池的访问,空闲信号量 `empty` 表示缓冲池空闲位置数量,满信号量 `full` 表示缓冲池已有数据数量。 生产者线程的主要操作是往缓冲池中写入数据。当缓冲池已满时,生产者需要等待空闲信号量 `empty`;当生产者向缓冲池中写入数据时,需要先获得互斥信号量 `mutex`,以保证缓冲池的访问不会发生冲突。 消费者线程的主要操作是从缓冲池中读取数据。当缓冲池为空时,消费者需要等待满信号量 `full`;当消费者从缓冲池中读取数据时,也需要先获得互斥信号量 `mutex`。 在 `main` 函数中,我们首先初始化三个信号量,然后创建多个生产者和消费者线程。当所有生产者和消费者线程都执行完毕后,我们销毁三个信号量

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值