linux 线程同步、互斥

24 篇文章 0 订阅
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


#define MAXITEMS 10000
#define MAXTHREADS 20

int nitems;
int buf[MAXITEMS];

struct
{
	pthread_mutex_t mutex;
	int nput;
	int nval;
}put = {PTHREAD_MUTEX_INITIALIZER};

struct
{
	pthread_mutex_t mutex;
	pthread_cond_t cond;
	int nready;
}nready = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER};

int min(int lhs, int rhs)
{
	return lhs > rhs ? rhs:lhs;
}

void *produce(void *arg)
{
	while(1)
	{
		pthread_mutex_lock(&put.mutex);
		if(put.nput >= nitems)
		{
			pthread_mutex_unlock(&put.mutex);
			return NULL;
		}
		buf[put.nput] = put.nval;
		put.nput++;
		put.nval++;
		pthread_mutex_unlock(&put.mutex);

		pthread_mutex_lock(&nready.mutex);
		if(nready.nready == 0)
			pthread_cond_signal(&nready.cond);
		nready.nready++;
		pthread_mutex_unlock(&nready.mutex);
		*((int *)arg) += 1;
	}
}

void *consume(void *arg)
{
	int i;

	for(i = 0; i <= nitems; i++)
	{
		pthread_mutex_lock(&nready.mutex);
		
		while(nready.nready == 0)
		{
			pthread_cond_wait(&nready.cond, &nready.mutex);//pthread_cond_wait()先解锁,再阻塞,返回时再加锁
		}
		nready.nready--;
		pthread_mutex_unlock(&nready.mutex);
		
		if(buf[i] != i)
			printf("buf[%d] = %d\n", i, buf[i]);
	}
	return NULL;
}

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

	if(argc != 3)
	{
		perror("argc error\n");
		exit(0);
	}

	nitems = min(atoi(argv[1]), MAXITEMS);
	nthreads = min(atoi(argv[2]), MAXTHREADS);

	pthread_setconcurrency(3);
	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);

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值