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);}
阅读全文
0 0
- C# 线程同步问题
- android中的线程同步问题
- C++中的线程同步问题
- C #中的几个线程同步对象方法
- C #中的几个线程同步对象方法
- C #中的几个线程同步对象方法
- C #中的几个线程同步对象
- C #中的几个线程同步对象方法
- C #中的几个线程同步对象方法
- Objective-C中的同步线程的锁
- Objective-C中的同步线程的锁
- Objective-C中的同步线程的锁
- 关于java中的线程同步问题
- c#中的线程同步或者异步问题
- 线程同步中的单例问题
- linux中的线程同步:生产者、消费者问题
- 浅谈.Net(C#)中的线程同步(一)
- 浅谈.Net(C#)中的线程同步(二)
- asp.net自定义错误页面
- QPainter 中的setWindow与setViewPort
- Android 6.0 运行时权限处理完全解析
- 模板函数的声明和定义为何不能分开放在两个文件中?
- Cesium中加载动态水
- C++中的线程同步问题
- driver failed programming external connectivity on endpoint wordpress
- Android:签名打包后关闭Log打印
- 软件测试
- InputStream 的坑!
- Java中wait和sleep方法的区别
- idea 中使用mongo 客户端 不用开一堆桌面 一个工具全搞定
- form表单下的button按钮会自动提交表单的问题
- 对javascript半包理解