线程间的互斥量和条件变量
来源:互联网 发布:vscode的php插件 编辑:程序博客网 时间:2024/05/21 09:21
互斥锁:
PS:互斥锁的生存周期必须大于用到互斥锁的线程的生存周期!
静态分配互斥量:
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
动态分配互斥量:
pthread_mutex_init(&mutex,NULL);
pthread_mutex_destroy(&mutex);
mutex————互斥锁。
加锁:
int pthread_mutex_lock(pthread_t* mutex);
尝试加锁:
int pthread_mutex_trylock(pthread_t* mutex);
解锁:
int pthread_mutex_unlock(pthread_t* mutex);
条件变量:
概念:
线程挂起直到共享数据的某些条件得到满足。
运行方式:
当线程运行到等待函数时,解开第二个参数的互斥锁,并等待信号;当接收到第一个参数的信号后,开始抢锁,抢到锁后继续向下执行。
当线程运行到激活函数时,发出一个信号,并继续执行下面的函数。
等待函数和激活函数必须同时运行才可以接收到信号。
静态分配条件变量:
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
动态分配条件变量:
pthread_cond_init(&cond,NULL);
pthread_cond_destroy(&cond);
条件等待:
int pthread_cond_wait(pthread_cond_t* cond,pthread_mutex_t* mutex);
cond——条件变量。
mutex——互斥锁。
计时等待:
int pthread_cond_timedwait(pthread_cond_t* cond,pthread_mutex_t* mutex,const struct timespec* adstime);
abstime——等待时间。
返回值——ETIMEDOUT(超时结束等待)。
单个激活:
int pthread_cond_signal(pthread_cond_t* cond);
返回值——0成功;正数为错误码。
全部激活:
int pthread_cond_broadcast(pthread_cond_t* cond);
返回值——0为成功;正数为错误码。
代码:
#include <stdio.h>#include <pthread.h>#include <sched.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;int currency;void* checkout(void* arg){sleep(1);for(;;){pthread_mutex_lock(&mutex);printf("checkout enter\n");currency = rand()%2000;printf("spend %d\n",currency);if(currency >= 1000){printf("signal boss\n");pthread_cond_signal(&cond1);printf("wait answer\n");}printf("checkout leave\n");pthread_mutex_unlock(&mutex);sleep(1);}}void* boss(void* arg){for(;;){pthread_mutex_lock(&mutex);printf("boss enter\n");printf("boss wait\n");pthread_cond_wait(&cond1,&mutex);printf("boss agress\n");printf("boss leave\n");pthread_mutex_unlock(&mutex);sleep(1);}}int main(){typedef void*(*func_t)(void*);func_t funcs[2] = {boss,checkout};pthread_t tids[2];int i;pthread_setconcurrency(2);for(i=0;i<2;i++){pthread_create(&tids[i],NULL,funcs[i],NULL);}for(i=0;i<2;i++){pthread_join(tids[i],NULL);}}
阅读全文
0 0
- 线程间的互斥量和条件变量
- linux线程同步:互斥量和条件变量的使用
- linux线程间通信之条件变量和互斥量
- 浅析线程间通信一:互斥量和条件变量
- 线程的同步--条件变量
- 线程的条件变量实例
- 线程条件变量的使用
- C++11的线程、锁和条件变量
- C++11的线程、锁和条件变量
- 线程同步的方法—互斥锁、信号量和条件变量
- 线程间同步,条件变量
- 使用‘互斥量’ 和 ‘条件变量’ 控制线程同步
- linux线程,互斥量,读写锁,条件变量和屏障
- 线程条件变量pthread_cond_t和线程条件锁详解
- 线程间同步实现--通过互斥锁和条件变量
- 基于条件变量和互斥量同步的三线程顺序打印abc(10次)实现
- 线程同步的方式——Mutex(互斥量)、 Condition variable(条件变量)和Semaphore(信号量)
- Linux线程浅析[线程的同步和互斥之线程同步的条件变量pthread_cond_t]
- java小白何去何从
- 分布式常见问题解决方法论
- 理解SQL SERVER中的分区表
- JVM基础(一):内存空间分配及其回收原理
- 访问修饰符public、private、protected、以及不写(默认)时的区别
- 线程间的互斥量和条件变量
- 工作
- 《数据结构学习与实验指导》2-8:用扑克牌计算24点
- (转)spring 集成 MetaQ
- Redis Sentinel 高可用实现说明
- Qt之QSS(样式表语法)
- linux安装redis及phpredis环境配置(超详细)
- spring aop类内部调用不拦截原因及解决方案
- JS 在页面上直接将json数据导出到excel,支持chrome,edge,IE10+,IE9,IE8,Safari,Firefox