信号量,互斥锁和条件变量之间的差异

信号量,互斥锁和条件变量 在linux编程中,常用于线程间的同步。
在计算机中,一些资源在同一时间只允许一个线程进行修改。
那么这三者根据自身的特点,适用于什么场合,他们三者之间有什么差异呢?

下面简单的用代码来描述一下 如何使用

1. 互斥锁

/* 初始化互斥锁*/  
pthread_mutex_lock(&mutex);  
/* 临界区 */  
pthread_mutex_unlock(&mutex);  

2. 条件变量

/* 初始化信号量和互斥锁  */
pthread_cond_signal(&cond);  
/* 操作 */  
phtread_cond_wait(&cond,&mutex);  

一般情况下 互斥锁和条件变量是在一起使用的。具体可以参考unp2.

3. 信号量

/* 初始化信号量为1 */  
sem_wait(&sem);  
/* 临界区 */  
sem_post(&sem);  

以上三段代码 看起来非常相似,但是 这三者到底有什么差异呢?

1. 互斥锁必须总是有给他上锁的线程解锁,信号量的挂出却不必有执行过他的等待操作 的同一线程执行。
2. 互斥锁要么被锁住,要么被解开,也就是就是两种状态。
3. 既然信号量有一个与之关联的状态,那么信号量挂出操作总是被记住。然后当想一个条件变量发送一个信号的时候,如果没有线程等待在该条件变量上,那么该信号将丢失。

你可能感兴趣的:(信号量,互斥锁和条件变量之间的差异)