互斥锁和条件变量
来源:互联网 发布:数控加工中心编程100例 编辑:程序博客网 时间:2024/04/29 12:37
http://www.cnblogs.com/Anker/archive/2013/01/09/2852442.html
为了允许在线程之间共享数据,同步是必须得,互斥锁和条件变量是同步的基本组成部分。
1. 互斥锁
互斥锁是用来保护临界区资源,实际上保护的是临界区资源,实际上保护的是临界区中被操纵的数据,互斥锁通常用于保护由多个线程或多进程分享的共享数据,一般是一些可供线程间使用的全局变量,来达到线程同步的目的,即保证任何时刻只有一个线程或进程在执行其中的代码,
pthread_mutex_lock()
临界区
pthread_mutex_unlock()
互斥锁API
pthread_mutex_lock( pthread_mutex_t *mutex )
用此函数加锁时,如果mutex已经被锁住,当前尝试加锁的线程就会阻塞,知道互斥锁被其他线程释放。当此函数返回时,说明互斥锁已经被当前线程成功加锁。
pthread_mutex_trylock( pthread_mutext_t *mutex )
用此函数加锁时,如果mutex已经被锁住,当前尝试加锁的线程不会被阻塞,而是立即返回,返回的错误码为EBUSY,而不是阻塞等待。
pthread_mutex_unlock( pthread_mutex_t *mutex )
注意使用锁之前要初始化,互斥锁得两种初始化方式:
1. 对于静态分配的互斥锁一般用宏赋值的方式初始化
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
2. 对于动态分配的互斥锁或分配在共享内存中,则必须调用pthread_mutex_init( pthread_mutex *mutex, pthread_mutexattr_t *mutexattr )函数来进行初始化。
2. 条件变量
条件变量类型是pthread_cond_t
pthread_cond_wait( pthread_cond_t *cond, pthread_mutex_t *pmutex );
pthread_cond_signal( pthread_cond_t *pcond );
给
struct
{
pthread_mutex_t mutex;
pthread_cond_t cond;
} var = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, ... }
pthread_mutex_lock( &var.mutex );
设置条件为真
pthread_cond_signal( &var.cond );
pthread_mutex_unlock( &var.mutex );
测试条件并进入睡眠以等待条件为真的代码如下:
pthread_mutex_lock( &var.mutex );
while( 条件为假 )
pthread_cond_wait( &var.cond, &var.mutex );
修改条件
pthread_mutex_unlock( &var.mutex );
定时等待和广播
通常pthread_cond_signal只是唤醒等待在相应条件变量上的一个线程,在某些情况下需要唤醒多个线程,可以调用pthread_cond_broadcast唤醒阻塞在相应条件变量上的所有线程。pthread_cond_timewait允许线程就阻塞时间设置一个限制值,API如下:
pthread_cond_broadcast( pthread_cond_t *cond );
pthread_cond_timewait( pthread_cond_t *cond, pthread_mutex, const struct timpespec *abstime );
0 0
- 互斥锁和条件变量
- 互斥锁和条件变量
- 条件变量和互斥锁
- 互斥锁和条件变量
- 互斥锁和条件变量
- 互斥锁和条件变量
- 互斥锁和条件变量
- 互斥锁和条件变量
- 互斥锁和条件变量
- 互斥锁和条件变量
- 条件变量和互斥锁
- 互斥锁和条件变量
- 互斥锁和条件变量
- linux互斥锁和条件变量
- Linux互斥锁和条件变量
- Linux互斥锁、条件变量和信号量
- Linux--Linux互斥锁、条件变量和信号量
- Linux--Linux互斥锁、条件变量和信号量
- impala
- R foundmental
- 如何在iOS中使用Block──How to use Blocks with iOS
- C++面向对象作业我之解答
- 好吧,CSS3 3D transform变换,不过如此!
- 互斥锁和条件变量
- 实用的JS代码大全
- linux设备驱动makefile入门解析
- 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
- 使用ffmpeg可以生成视频截图
- 当C#调用C++的dll时当心string
- 适合中文关键字的哈希函数
- C++ - 虚继承(virtual inheritance)
- yii gii You are not allowed to access this page.