互斥锁和条件变量

来源:互联网 发布:数控加工中心编程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