C++中的线程同步问题

来源:互联网 发布:为什么安装不了软件 编辑:程序博客网 时间:2024/06/06 20:34

1、创建线程   

 pthread_create(pthread_t* __pthread_ptr, pthread_attr_tconst* __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);}

 

原创粉丝点击