首页 > 其他分享 >消费者进行轮询等待

消费者进行轮询等待

时间:2022-10-11 23:33:32浏览次数:47  
标签:消费者 min 轮询 mutex pthread shared include 等待 nthreads

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define min(a,b) ((a)<(b)?(a):(b))
#define MAXNITEMS   1000000
#define MAXNTHREADS 10

int nitems;
struct {
	pthread_mutex_t mutex;
	int buff[MAXNITEMS];
	int nput;
	int nval;
}shared={
	PTHREAD_MUTEX_INITIALIZER
};

void *produce(void *), *consume(void *);

int main(int argc, char **argv) {
	int i, nthreads, count[MAXNTHREADS];
	pthread_t tid_produce[MAXNTHREADS], tid_consume;

	if(argc!=3) {
		fprintf(stderr, "usage: ./a.out <#items> <#threads>.\n");
		exit(-1);
	}
	nitems=min(atoi(argv[1]), MAXNITEMS);
	nthreads=min(atoi(argv[2]), MAXNTHREADS);

	pthread_setconcurrency(nthreads+1);

	for(i=0;i<nthreads;i++) {
		count[i]=0;
		pthread_create(&tid_produce[i], NULL, produce, &count[i]);
	}
	pthread_create(&tid_consume, NULL, consume, NULL);

	for(i=0;i<nthreads;i++) {
		pthread_join(tid_produce[i], NULL);
		printf("count[%d]=%d\n", i, count[i]);
	}

	pthread_join(tid_consume, NULL);

	exit(0);
}

void *produce(void *arg) {
	for(;;)	{
		pthread_mutex_lock(&shared.mutex);
		if(shared.nput>=nitems) {
			pthread_mutex_unlock(&shared.mutex);
			return NULL;
		}
		shared.buff[shared.nput]=shared.nval;
		shared.nput++;
		shared.nval++;
		pthread_mutex_unlock(&shared.mutex);
		*((int *)arg)+=1;
	}
}

void consume_wait(int i) {
	for(;;) {
		pthread_mutex_lock(&shared.mutex);
		if(i<shared.nput) {
			pthread_mutex_unlock(&shared.mutex);
			return;
		}
		pthread_mutex_unlock(&shared.mutex);
	}
}

void *consume(void *arg) {
	int i;
	for(i=0;i<nitems;i++) {
		consume_wait(i);
		if(shared.buff[i]!=i) {
			printf("buff[%d]=%d\n", i, shared.buff[i]);
		}
	}
	return NULL;
}

  

标签:消费者,min,轮询,mutex,pthread,shared,include,等待,nthreads
From: https://www.cnblogs.com/donggongdechen/p/16783008.html

相关文章

  • 多个生产者,单个消费者,互斥锁
    #include<stdio.h>#include<stdlib.h>#include<pthread.h>#definemin(a,b)((a)<(b)?(a):(b))#defineMAXNITEMS1000000#defineMAXNTHREADS10intnitems......
  • 线程通信练习--生产者与消费者
    packageexer4;/***@author高槐玉*#Description生产者,消费者案例*#Date:2022/10/9/14点08分*#Shangguigu:*/classClerk{privateintgoods=0......
  • kafka消费者学习
    转自:https://www.cnblogs.com/cxuanBlog/p/11949238.html1.介绍  Kafka消费者从属于消费者群组。一个群组中的消费者订阅的都是相同的主题,每个消费者接收主题一部分分......
  • kali 和 centOS 更改菜单项等待选项时间
    kali和CentOS的开机会有引导界面,默认需等待5秒才能自动进入默认的启动项,接下来会尝试将等待时间调成0秒,也就是跳过启动菜单,直接进入默认启动项 kali//转成root用户sudo......
  • Kafka教程(二)API开发-生产者、消费者、topic
    一、地址1、实时更新的思维导图​​https://www.mubucm.com/doc/4uqlpedefuj​​2、图片二、具体内容5.producer生产者demo发送pro.send(newProducerRecord<String,String>......
  • python-生产者与消费者模型
    """生产者; 生产/制造东西的消费者: 消费/处理东西的该模型除了上述两个之外还需要一个媒介 生活中的例子做包子,将包子做好之后放在蒸笼里(媒介),买包子的取蒸笼里面拿 ......
  • P1823 [COI2007] Patrik 音乐会的等待
    用单调队列维护即可,注意要考虑高度相同的情况(可以记录单调队列中相同的个数)。时间复杂度为\(O(n)\)。#include<bits/stdc++.h>usingnamespacestd;#defineintlong......
  • 手动创建kafka生产者,消费者
    pom.xml<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><exclusions>......
  • 服务器被DDOS攻击,目前等待解封,开站时间待定!
    不知道那个挨千刀的没事干D我,为了安全关机几天了,腾讯那边也直接帮我隔离了!等过几天在开站,先挂在博客园吧!......
  • 多线程案例 : 等待别人到达开饭
    这里我们要把别人当作一个线程。当每一个线程开启时,我们指定一个点,让他们同时到达并执行,所以使用CyclicBarrier设定一个障碍,并设置这个障碍的参数,指定规则由多少个线程同......