博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux中的条件变量
阅读量:5053 次
发布时间:2019-06-12

本文共 2702 字,大约阅读时间需要 9 分钟。

1 大家可能知道互斥量是线程程序中必须的工具了,但是也不能是万能的,就比如某个线程正在等待共享数据某个条件的发生,这个时候会发生什么呢。它就可能重复的尝试对互斥对象锁定和解锁来检查共享数据结构。

2 线程在等待满足某些条件的时候使线程进入睡眠状态,一旦条件满足了就唤醒并等待满足特定条件而睡眠的线程。

3 条件变量一般都允许线程阻塞和等待另一个线程发送信号的方法来弥补互斥锁的不足。

4 函数介绍

(1) 静态方式使用 pthread_cond_t cond=PTHREAD_COND_INITIALIZER

动态方式 int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr)

-------->当cond_attr为null的时候使用默认的属性。

(2)注销一个条件变量

int pthread_cond_destroy(pthread_cond_t *cond)只有没有线程在这个条件变量的时候才能注销这个条件变量。

(3)等待有两种方式,条件等待和时间等待。无论哪种等待都必须和一个互斥锁配合来防止多个线程同时请求pthread_cond_wait()这个竞争条件。

(4)激发 两种方式,pthread_cond_signal()激活一个等待该条件的线程。pthread_cond_broadcast()激活所有等待线程。

5例子

(1)第一个例子

1 #include 
2 #include
3 #include
4 using namespace std; 5 pthread_cond_t qready = PTHREAD_COND_INITIALIZER; /*初始构造条件变量*/ 6 pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; /*初始构造锁*/ 7 int x = 10; 8 int y = 20; 9 void *func1(void *arg){10 cout<<"func1 开始"<
y){29 pthread_cond_signal(&qready);//发送信号 使线程1不阻塞30 }31 cout<<"func2 结束"<
View Code

(2)第二个例子

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 using namespace std;10 11 /*提示出租车到达的条件变量*/12 pthread_cond_t taxiCond = PTHREAD_COND_INITIALIZER; 13 /*同步锁*/14 pthread_mutex_t taxiMutex = PTHREAD_MUTEX_INITIALIZER; 15 16 int travelerCound=0;17 //旅客到来的时候 数量加上118 void * traveler_arrive(void * name){19 cout<<"Traveler: "<<(char *)name<<" needs a taxi now!"<
0){35 pthread_cond_signal(&taxiCond);36 pthread_mutex_unlock(&taxiMutex); 37 break; 38 }39 pthread_mutex_unlock(&taxiMutex);40 }41 pthread_exit((void*)0);42 }43 44 int main(){45 pthread_t tids[3];46 int iRet = pthread_create(&tids[0],NULL,taxi_arrive,(void*)(" Jack "));47 if(iRet){48 printf("pthread_create error: iRet=%d\n",iRet);49 return iRet;50 }51 printf("Time passing by.\n");52 sleep(1);53 iRet = pthread_create(&tids[1],NULL,traveler_arrive,(void*)(" Susan "));54 if(iRet){55 printf("pthread_create error: iRet=%d\n",iRet);56 return iRet;57 }58 printf("Time passing by.\n");59 sleep(1); 60 iRet = pthread_create(&tids[2],NULL,taxi_arrive,(void*)(" Mike "));61 if(iRet){62 printf("pthread_create error: iRet=%d\n",iRet);63 return iRet;64 } 65 printf("Time passing by.\n");66 sleep(1);67 68 void *retval; 69 for(int i=0;i<3;i++){70 iRet=pthread_join(tids[i],&retval);71 if (iRet){72 printf("pthread_join error: iRet=%d\n",iRet);73 return iRet;74 }75 printf("retval=%ld\n",(long)retval); 76 }77 return 0; 78 }

好叻 加油!!!!

转载于:https://www.cnblogs.com/lanjianhappy/p/8985683.html

你可能感兴趣的文章
svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted
查看>>
Webpack4 学习笔记四 暴露全局变量、externals
查看>>
CF1005F Berland and the Shortest Paths
查看>>
vscode点击ctrl键报错Request textDocument/definition failed.
查看>>
图王:刺客——运筹帷幄善于在变化中找到方向的站长
查看>>
Safari无痕浏览影响localStorage
查看>>
POJ 3368 Frequent values (RMQ,4级)
查看>>
java 练习题3
查看>>
对象生命周期的简单理解
查看>>
c# 日志记录 行号
查看>>
CSS3---12.过渡动画
查看>>
[NOI1995]石子合并 四边形不等式优化
查看>>
vim 实现begin end 配对 使用matchit插件
查看>>
linux挂载磁盘以及扩容主分区
查看>>
[转]Python模块学习:threading 多线程控制和处理
查看>>
PHP链接sqlserver出现中文乱码
查看>>
[计算机]Alan Perlis人物简介
查看>>
Android-----第三方 ImageLoader 的简单配置和使用
查看>>
零基础入门Python3-详解分支
查看>>
js数组去重
查看>>