线程的同步与复用之 (互斥量)

A. mutex (互斥量)
对于多线程的程序,访问冲突的问题是很普遍的, 引入互斥用来保证在任一时刻,只能有一个线程访问该对象, 来保证共享数据操作的完整性 。
解决的办法是引入互斥锁(Mutex,Mutual Exclusive Lock),获得锁的线程可以完成“读-修改-写”的操作,然后释放锁给其它线程,没有获得 锁的线程只能等待而不能访问共享数据,这样“读-修改-写”三步操作组成一个原子操作,要么 都执行,要么都不执行,不会执行到中间被打断,也不会在其它处理器上并行做这个操作。
 
//初始化
int pthread_mutex_init (pthread_mutex_t *__mutex, __const pthread_mutexattr_t *__mutexattr); 
pthread_mutex_t mlock = PTHREAD_MUTEX_INITIALIZER;
//销毁
int pthread_mutex_destroy (pthread_mutex_t *__mutex);
//try上锁
int pthread_mutex_trylock (pthread_mutex_t *__mutex); 
//上锁
int pthread_mutex_lock (pthread_mutex_t *__mutex); 
//解锁
int pthread_mutex_unlock (pthread_mutex_t *__mutex);
 
 
一个线程可以调用pthread_mutex_lock获得Mutex,如果这时另一个线程已经调用 pthread_mutex_lock获得了该Mutex,则当前线程需要挂起等待,直到另一个线程调用 pthread_mutex_unlock释放Mutex,当前线程被唤醒,才能获得该Mutex并继续执行。
如果一个线程既想获得锁,又不想挂起等待,可以调用pthread_mutex_trylock,如果Mutex已 经被 另一个线程获得,这个函数会失败返回EBUSY,而不会使线程挂起等待。
每个Mutex有一个等待队 列,一个线程要在Mutex上挂起等待,首先在把自己加入等待队列中,然后置线程状态为睡眠,然 后调用调度器函数切换到别的线程。一个线程要唤醒等待队列中的其它线程,只需从等待队 列中取出一 项,把它的状态从睡眠改为就绪,加入就绪队列,那么下次调度器函数执行时就有 可能切换到被唤醒的线程。
 
 
 
 
 
 
posted @ 2016-08-01 14:18  _in_the_way  阅读(367)  评论(0编辑  收藏  举报