同步(一)互斥锁与条件变量
来源:互联网 发布:remix软件 编辑:程序博客网 时间:2024/04/28 12:56
一 概述:
(1)互斥锁与条件变量的特点:
*互斥锁用于上锁,条件变量用于等待。
*互斥锁和条件变量可以用于线程或进程间的同步,是基于共享内存区。用于进程间同步时,需放置在多个进程的共享内存区中。
*互斥锁必须由给它上锁的线程解锁。
*任何时刻只有一个线程能够锁住一个给定的互斥锁。
*静态分配的互斥锁或条件变量具备默认属性,我们可以利用函数来以非默认属性初始化它们。
*编程技巧:把共享数据和它们的同步变量(互斥锁、条件变量或信号量)收集到一个结构。
二 互斥锁:用于上锁。
(1)互斥锁:相互排斥,最基本的同步形式。用于保护临界区(critical region),以保证任何时刻只有一个线程在执行其中的代码。
*通常轮廓:
lock_the_mutex(...)
临界区 //应该努力减少由一个互斥锁锁住的代码量。
unlock_the_mutex(...)
(2)互斥锁的初始化:
Posix互斥锁被声明为pthread_mutex_t数据类型的变量。
1.有两种初始化方式:
*如果互斥锁是静态分配的,可以把它初始化为常量:PTHREAD_MUTEX_INITIALIZER。
*如果互斥锁是动态分配的(例如通过malloc),或者分配在共享内存区中,那么必须在运行时通过调用pthread_mutex_init函数来初始化。通过动态分配可以指定进程间共享属性,从而允许在不同进程间共享某个互斥锁或条件变量,前提是互斥锁或条件变量必须放在这些进程的共享内存区中。
(3)上锁或解锁:
1.相关函数:
int pthread_mutex_lock(pthread_mutex_t *mptr);//已锁住,则阻塞
int pthread_mutex_trylock(pthread_mutex_t *mptr);//不阻塞
int pthread_mutex_unlock(pthread_mutex_t *mptr);
返回值:成功返回0;若出错则为正的Exxx值。
2.注意:
*如果尝试对一个已由另外某个线程锁住的互斥锁上锁,那么pthread_mutex_lock将阻塞到该互斥锁解锁位置。
*pthread_mutex_trylock:是对应的非阻塞函数,如果该互斥锁已锁住,它就返回一个EBUSY错误。
*如果多个线程阻塞在等待同一互斥锁解锁,那么解锁后将唤醒优先级最高的线程。(互斥锁、条件变量和信号量都一样).
三 条件变量:用于等待。
(1)条件变量特点:
*类型为pthread_cond_t。
*每个条件变量总是由一个互斥锁与之关联。
*静态分配的条件变量可以初始化为PTHREAD_COND_INITIALIZER。
*动态分配的条件变量和动态分配的互斥锁一样。可以使用相关函数初始化。
(2)相关函数:
int pthread_cond_wait(pthread_cond_t *cptr,pthread_mutex_t *mptr)
int pthread_cond_signal(pthread_cond_t *cptr)
int pthread_cond_broadcast(pthread_cond_t *cptr)
int pthread_cond_timedwait(pthread_cond_t *cptr,pthread_mutex_t *mptr,const struct timespec *abstime)
返回值:成功返回0;若出错则为正的Exxx值。
*注意:pthread_cond_wait原子地执行以下两个动作:给互斥锁解锁;把调用线程投入睡眠,直到另外某个线程就本条件变量调用pthread_cond_signal。pthread_cond_wait返回前重新给互斥锁上锁。
四 互斥锁和条件变量的属性
(1)互斥锁与条件变量的动态初始化和摧毁:
*int pthread_mutex_init(pthread_mutex_t *mptr,const pthread_mutexattr_t *attr)
*int pthread_mutex_destroy(pthread_mutex_t *mptr)
*int pthread_cond_init(pthread_cond_t *cptr,constr pthread_condattr_t *attr)
*int pthread_cond_destroy(pthread_cond_t *cptr)
返回值:成功返回0;若出错则为正的Exxx值。
其中mptr必须指向一个已分配的pthread_mutex_t变量,并由pthread_mutex_init函数初始化该锁.
attr指向的pthread_mutexattr_t值指定其属性,该参数为空,则是默认属性。
条件变量类似。
(2)互斥锁与条件变量的属性:
1.互斥锁的属性的数据类型为:pthread_mutexattr_t,条件变量的属性的数据类型为pthread_condattr_t。
2.属性的初始化和摧毁函数:
*int pthread_mutexattr_init(pthread_mutexattr_t *attr)
*int pthread_mutexattr_destroy(pthread_mutexattr_t *attr))
*int pthread_condattr_init(pthread_condattr_t *attr)
*int pthread_condattr_destroy(pthread_condattr_t *attr)
返回值:成功返回0;若出错则为正的Exxx值。
3.启用和禁止特定属性:
*一旦某个互斥锁或条件变量属性对象已被初始化,就可以调用不同函数启用或禁止特定的属性。
例如:指定互斥锁或条件变量在不同进程间共享的函数:
*int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr,int *valptr)
*int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,int value)
*int pthread_condattr_getpshared(const pthread_condattr_t *attr,int *valptr)
*int pthread_condattr_setpshared(pthread_condattr_t *attr,int value)
返回值:成功返回0;若出错则为正的Exxx值。
两个get函数返回由valptr指向的整数中的这个属性的值;两个value的值设定这个属性的值。
value值可以是PTHREAD_PROCESS_PRIVATE或PTHREAD_PROCESS_SHARED(进程间共享)。
- 同步(一)互斥锁与条件变量
- 同步线程:条件变量与互斥锁
- IPC同步 笔记之 互斥锁与条件变量
- linux线程间同步(1)互斥锁与条件变量
- 进程间同步——互斥锁与条件变量
- 线程同步:互斥量与条件变量
- 【线程同步与互斥】条件变量
- 条件变量与互斥锁
- 互斥锁与条件变量
- 互斥锁与条件变量
- 条件变量与互斥锁
- 互斥锁与条件变量
- 互斥锁与条件变量
- 条件变量与互斥锁
- 互斥锁与条件变量
- 线程间同步--互斥锁、条件变量、信号量
- 线程同步、条件变量、互斥锁的使用
- 线程间同步--互斥锁、条件变量、信号量
- JS全选和放大特效
- 分布式搜索Elasticsearch——检索一条记录
- 8.mini2440通过触摸屏绘制轨迹(裸机)
- 线程(一)创建和终止
- 线程(二)线程控制
- 同步(一)互斥锁与条件变量
- eclips断点调试
- ListView绑定数据的原理
- Javascript模块化编程系列三: CommonJS & AMD 模块化规范描述
- oracle logMiner操作步骤
- ARC
- Filter过滤敏感字符
- Inside COM读书笔记------接口
- Linux环境下文件查找之----find