⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prg7_3.c

📁 配套光盘网络编程进程间的通信,网络编程进程间的通信是一本很经典的好书
💻 C
字号:
#include <pthread.h>
#include <stdlib.h>
#include <errno.h>

#define MAXNITEMS	1000000
#define MAXNTHREADS	100

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

int min(int a ,int b)
{
  return (a>=b ? b : a);
}
 
void  *procedure(void *),*consume(void *);
int  main(int argc,char **argv)
{
	int  i,nthreads,count[MAXNTHREADS];
	pthread_t  tid_produce[MAXNTHREADS],tid_consume;
	if (argc != 3)
	{
		perror("usage:prodcons <#items> <#threads>");
		exit(0);
	}
	nitems = min(atoi(argv[1]),MAXNITEMS);
	nthreads = min(atoi(argv[2]),MAXNTHREADS);
	pthread_setconcurrency(nthreads);
	
	for(i=0;i<nthreads;i++)
	{
		count[i] = 0;
		pthread_create(&tid_produce[i],NULL,procedure,&count[i]);
	}
	
	for(i=0; i<nthreads; i++)
	{
		pthread_join(tid_produce[i],NULL);
		printf("count[%d] = %d\n",i,count[i]);
	}
	pthread_create(&tid_consume,NULL,consume,NULL);
	pthread_join(tid_consume,NULL);
	exit(0);
}

void *procedure(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(void *arg)
{
	int  i;
	for(i=0;i<nitems; i++)
	{
		if (shared.buff[i] != i)
		  printf("buff[%d]=%d\n",i,shared.buff[i]);
	}
	return(NULL);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -