C++中的线程同步问题

1 篇文章 0 订阅

1、创建线程   

 pthread_create(pthread_t* __pthread_ptr, pthread_attr_t const* __attr, void* (*__start_routine)(void*), void*)

   第一个参数:线程的引用
   第二个参数:线程的属性
   第三个参数:线程执行的方法
   第四个参数:线程传递给线程执行方法的参数

2、pthread_join函数

 pthread_join(pthread_t __pthread,void** __return_value_ptr);

    该函数的作用:主线程要等待__pthread线程执行完成后,才执行

 __pthread:线程的引用

 __return_value_ptr:线程在执行pthread_exit(0)时传入的值。在此处纯传入的是0。

3、线程的同步

 锁:pthread_mutex_t  mutex

 条件变量:pthread_cond_t has_product

 加锁:pthread_mutex_lock(&mutex)

 开锁:pthread_mutex_unlock(&mutex)

 阻塞:pthread_cond_wait(&has_product,&mutex)

 解开阻塞的信号:pthread_cond_signal(&has_product)


 相关代码:

 

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
// 产品数量
int pruductNum=0;

//互斥锁
pthread_mutex_t  mutex;

//条件变量
pthread_cond_t has_product;

//生产者
void * produce(void *arg){
	char* name=(char*)arg;
	for(;;){//不断循环
	//锁住
	  pthread_mutex_lock(&mutex);
	  pruductNum++;
	  printf("生产者  生产 %d \n",pruductNum);
	  //发送一条解开阻塞的信号
	 pthread_cond_signal(&has_product);
	//解锁
	pthread_mutex_unlock(&mutex);
	  sleep(3);
	}
}

//消费者
void* consumer(void* arg){
	char* name=(char*)arg;
	for(;;){//不断循环
     //加锁
	 pthread_mutex_lock(&mutex);
	//如果产品列表为空
	   while(pruductNum==0){
		printf("没有产品了");
		pthread_cond_wait(&has_product,&mutex);
	   }
	
       pruductNum--;
	   printf("消费者 %s  消费%d\n",name,pruductNum);
	   pthread_mutex_unlock(&mutex);
	   sleep(1);
	}


}
void main(){
	pthread_mutex_init(&mutex,NULL);

	pthread_cond_init(&has_product,NULL);
	//线程的引用
    pthread_t tid1,tid2,tid3;
    pthread_create(&tid1,NULL,produce,"生产者");
	pthread_create(&tid2,NULL,consumer,"消费者1");
	pthread_create(&tid3,NULL,consumer,"消费者2");
	
    void *rval;
    pthread_join(tid1,&rval);
	pthread_join(tid2,&rval);
	pthread_join(tid3,&rval);
    printf("线程结束%d\n",rval);

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值