分类: LINUX
2012-04-06 15:12:52
互斥锁 mutex 用来保证一段时间内只有一个线程在执行一段代码。
原子性:对 mutex 的加锁和解锁操作是原子的,一个线程进行 mutex 操作的过程中,其他线程不能对同一个 mutex 进行其他操作。
单一性:拥有 mutex 的线程除非释放 mutex ,否则其他线程不能拥有此 mutex 。
非忙等待:等待 mutex 的线程处于等待状态,直到要等待的 mutex 处于未加锁状态,这时操作系统负责唤醒等待此 mutex 的线程。
互斥锁创建和删除
int pthread_mutex_init(pthread_mutex_t * mutex ,const pthread_mutexattr_t * attr) ;
int pthread_mutex_destroy(pthread_mutex_t * mutex);
互斥变量使用前必须初始化,可以静态的初始化,如:pthread_mutex_tmymutex = PTHREA D_MUTEX_ INITIALIZER;也可调用 pthread_mutex_init() 动态的进行初始化,动态初始化可以设置互斥量的属性, attr=NULL 时使用默认属性。初始化的互斥量是没锁定的。当互斥量不再需要时调用 pthread_mutex_destroy()释放互斥量。
互斥锁锁定与解锁
int pthread_mutex_lock (pthread_mutex_t * mutex) ;
int pthread_mutex_trylock (pthread_mutex_t * mutex);
int pthread_mutex_unlock(pthread_mutex_t * mutex) ;
当线程需要互斥锁时调用 pthread_mutex_lock () 来 获取互斥锁, 如果当前锁不可得则阻塞线程直到其它线程释放该锁从而锁可得为止。当保护区段执行完后需调用 pthread_mutex_unlock () 以便其它等待锁的线程能继续执行。
Pthreads API - 读写锁
读写锁是从互斥锁中发展下来的,互斥锁会将试图访问我们定义的保护区的所有进程都阻塞掉,但读写锁与此不同,它会将访问中的读操作和写操作区分开来对待
在某些读数据比改数据频繁的应用中,读写锁将会比互斥锁表现出很大的优越性
读写锁所遵循的规则:
只要没有进程持有某个给定的读写锁用于写,那么任意数目的线程都可持有该读写锁用于读
仅当没有线程持有某个给定的读写锁用于读或写,才能分配该读写锁用于写。
创建和删除读写锁
int pthread_rwlock_init( pthread_rwlock_t *rwlock, const pthread_rwlockattr_t * attr) ;
int pthread_rwlock_destroy(pthread_r wlock_t *rwlock);
int pthread_rwlock_unlock (pthread_rwlock_t *rwlock );
int pthread_rwl ck_rdlock (pthread_rwlock_t *r wlock );
int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock );
int pthread_rwlock_wrlock (pthread_rwlock_t *r wlock );
int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock );
初始化读写锁可以静态的方法,如:pthread_rwlock_trwlock = PTHREAD_RWLOCK_ INITIALIZER;
也可调用 p thread _r wlock_ init() 进行动态初始化。 pthread _rwlock_rdlock () 可用来向 rwlock 所引用的读写锁应用读锁。 pthread_rwlock_wrlock () 可用来向 rwlock 所引用的读写锁应用写锁。 pthread _rwlock_unlock () 可用来释放在 rwlock 引用的读写锁对象中持有的锁。 pthread_rwlock_destroy() 可用来销毁 rwlock 引用的读写锁对象并释放该锁使用的任何资源。
Pthreads API - 条件变量
创建和删除条件变量
int pthread_cond_init( pthread_cond_t * condition ,const pthread_condattr_t * attr) ;
int pthread_cond_destroy(pthread_cond_t * condition);
使用条件变量前必须初始化,可以采用静态的方法初始化条件变量,如:pthread _cond _tmyconvar = PTHREAD_COND_INITIALIZER;
也可以调用 pthread_cond_init() 动态的初始化,动态初始化可以设置条件变量的属性。当条件变量不再需要时,调用pthread_cond_destroy() 释放它。
等待和通知条件变量
int pthread_cond_wait(pthread_cond_t * condition ,pthread_mutex_t * mutex);
int pthread_cond_timedwait(pthread_cond_t *cv,pthread_mutex_t *mp, const struct timespec *abstime);
int pthread_cond_signal(pthread_cond_t * condition);
int pthread_cond_broadcast(pthread_cond_t * condition) ;
调用 pthread_cond_wait 来等待条件信号,线程将被阻塞直到指定的条件信号出现。条件等待之前应先锁定信号量,等待时会自动解锁,条件信号到达唤醒线程后又将自动锁定。所以之后编程者需在锁用完后解锁它。 pthread_cond_timedwait() 最多等待给定的时间。
使用 pthread_cond_signal () 来发出条件信号以唤醒等待条件信号者。即激活一个等待该条件的线程,
当有多个线程等待条件变量时使用 pthread_cond_broadcast() 广播条件信号,即激活所有等待线程
例一
例二