linux条件变量
来源:互联网 发布:淘宝网人工电话 编辑:程序博客网 时间:2024/06/07 04:02
近因为工作需要,对异步编程进行一些了解。当使用boost库asio模块实现异步编程之后,顺便对同步编程进行了一次学习。本次学习主要参考UP的第十一章“线程”,为了加深理解线程同步问题,也为了利于后期复习,特别将个人的理解记录下来。
互斥锁此处略过不提,详细请参看UP的相关章节,再结合网络上的一些简单例程,应该是很容易理解的。本次主要讲的是线程同步中用到的“条件变量”。条件变量是线程用于同步的另一种同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。
条件变量的使用步骤:
1、定义互斥锁和条件变量:pthread_mutex_t mutex , pthread_cond_t cond
2、初始化信号锁和条件变量(一般分两种方式):pthread_mutex_init(&mutex,NULL) , pthread_cond_init(&cond,NULL)
3、组合调用:
pthread_mutex_lock(&mutex);pthread_cond_wait(&cond,&mutex);/*your code*/pthread_mutex_unlock(&mutex);
最容易的理解方式是自己写一份简单的同步代码:
#include <stdio.h>#include <pthread.h>#include <stdlib.h>pthread_mutex_t mutex;pthread_cond_t cond;void* th1(void* arg){ while(1){ printf("thread1 is runnding\n"); pthread_mutex_lock(&mutex); printf("等待5秒钟,thread1 释放互斥锁\n"); sleep(5); pthread_cond_wait(&cond,&mutex); printf("thread1 apply the condition\n"); pthread_mutex_unlock(&mutex); sleep(3); }}void* th2(void* arg){ while(1){ printf("thread2 is runnding\n"); pthread_mutex_lock(&mutex); printf("thread1释放互斥锁后,阻塞的thread2得到运行机会\n"); pthread_cond_wait(&cond,&mutex); printf("thread2 apply the condition\n"); pthread_mutex_unlock(&mutex); sleep(3); }}int main(int argc, const char *argv[]){ pthread_t tid1; pthread_t tid2; pthread_mutex_init(&mutex,NULL); pthread_cond_init(&cond,NULL); pthread_create(&tid1,NULL,th1,NULL); pthread_create(&tid2,NULL,th2,NULL); char in; while (in = getchar()) { if(in == 'a') pthread_cond_signal(&cond); sleep(1); } return 0;}
注:因为属于测试代码,所以没有对函数的返回值进行测试。
仔细观察代码,可以看出条件变量在整个同步过程中所处的角色。执行流程如下图所示:
其中,第1步由pthread_mutex_lock函数上锁;第2和第3步由pthread_cond_wait函数进行解锁和上锁,pthread_cond_wait测试条件,并将调用线程添加到等待线程队列中,该操作是原子操作。调用线程处于阻塞状态,此时的互斥锁被解锁。等函数等到信号,并成功返回后对互斥锁进行上锁;第4步可用于保护资源的编码;第5步由pthread_mutex_unlock函数解锁。如果没有第2和第3步,则该流程只是一个简单的互斥锁过程。
- Linux 下条件变量
- linux 条件变量
- linux条件变量用法
- Linux 条件变量 pthread_cond_wait
- linux 条件变量
- linux同步-条件变量
- Linux 条件变量
- Linux 条件变量 pthread_cond_wait
- linux 多线程-条件变量
- Linux 条件变量 pthread_cond_wait
- 理解 Linux 条件变量
- linux条件变量
- linux 线程 条件变量
- 理解 Linux 条件变量
- linux 条件变量--同步
- linux条件变量若干问题
- linux条件变量
- Linux _条件变量
- Asp.Net MVC4.0学习之三--添加一个视图
- EM按钮乱码
- Asp.Net MVC4.0 学习之四--添加一个模型
- 第六题(下排每个数都是先前上排那十个数在下排出现的次数)
- 关闭软键盘
- linux条件变量
- Asp.Net MVC4.0学习之五--控制器访问模型数据
- Asp.Net MVC4.0学习之六--查看Edit方法和Edit视图
- QT 监听 USB 设备 插入、拔出动作
- Rotate List
- Android开机广播无效问题(手机Root后)
- hdu 1316 How Many Fibs?
- Asp.Net MVC4.0学习之七--增加搜索方法和视图
- 告诉你一个秘密