线程间的互斥量和条件变量

互斥锁:

PS:互斥锁的生存周期必须大于用到互斥锁的线程的生存周期!

静态分配互斥量:

pthread_mutex_t  mutex=PTHREAD_MUTEX_INITIALIZER;

动态分配互斥量:

pthread_mutex_init(&mutex,NULL);

pthread_mutex_destroy(&mutex);

mutex————互斥锁。

加锁:

int pthread_mutex_lock(pthread_t* mutex);

尝试加锁:

int pthread_mutex_trylock(pthread_t* mutex);

解锁:

int pthread_mutex_unlock(pthread_t* mutex);


条件变量:

概念:

线程挂起直到共享数据的某些条件得到满足。

运行方式:

当线程运行到等待函数时,解开第二个参数的互斥锁,并等待信号;当接收到第一个参数的信号后,开始抢锁,抢到锁后继续向下执行。

当线程运行到激活函数时,发出一个信号,并继续执行下面的函数。

等待函数和激活函数必须同时运行才可以接收到信号。

静态分配条件变量:

pthread_cond_t  cond=PTHREAD_COND_INITIALIZER;

动态分配条件变量:

pthread_cond_init(&cond,NULL);

pthread_cond_destroy(&cond);

条件等待:

int  pthread_cond_wait(pthread_cond_t*  cond,pthread_mutex_t* mutex);

cond——条件变量。

mutex——互斥锁。

计时等待:

int  pthread_cond_timedwait(pthread_cond_t* cond,pthread_mutex_t* mutex,const struct timespec* adstime);

abstime——等待时间。

返回值——ETIMEDOUT(超时结束等待)。

单个激活:

int pthread_cond_signal(pthread_cond_t* cond);

返回值——0成功;正数为错误码。

全部激活:

int pthread_cond_broadcast(pthread_cond_t*  cond);

返回值——0为成功;正数为错误码。

代码:

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

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;

int currency;

void* checkout(void* arg){
	sleep(1);
	for(;;){
		pthread_mutex_lock(&mutex);
		printf("checkout enter\n");
		currency = rand()%2000;		
		printf("spend %d\n",currency);
		if(currency >= 1000){
			printf("signal boss\n");
			pthread_cond_signal(&cond1);
			printf("wait answer\n");
		}
		printf("checkout leave\n");
		pthread_mutex_unlock(&mutex);
		sleep(1);
	}
}

void* boss(void* arg){
	for(;;){
		pthread_mutex_lock(&mutex);
		printf("boss enter\n");
		printf("boss wait\n");
		pthread_cond_wait(&cond1,&mutex);
		printf("boss agress\n");
		printf("boss leave\n");
		pthread_mutex_unlock(&mutex);
		sleep(1);
	}
}

int main(){
	typedef void*(*func_t)(void*);
	func_t funcs[2] = {boss,checkout};
	pthread_t tids[2];
	int i;
	pthread_setconcurrency(2);
	for(i=0;i<2;i++){
		pthread_create(&tids[i],NULL,funcs[i],NULL);
	}
	for(i=0;i<2;i++){
		pthread_join(tids[i],NULL);
	}	
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值