最近在学线程池,所以会碰到这两个概念。
这里的锁指的是pthread_mutex_t,条件变量指的是pthread_cond_t。
在操作系统的课程中,曾经学习到锁是用来创建一个临界区的,大概的形式如下:
do{
请求锁
临界区
释放锁
剩余区
}while(true);
而条件变量在我的印象中是管程中的信号量,用来对于封装好的管程,可以使进入管程的进程暂时放弃临界区的访问。
信号量有两个原子操作,即P(wait)V(signal)操作。
其大致形式如下:
do{
waiting(mutex);//互斥信号量
临界区;
signal(mutex);
剩余区;
}while(true);
但是这里的条件变量似乎就是一般的信号量。用于控制进程间的同步。
锁和信号量的功能似乎有点相似,似乎都能用来制造一个临界区,那么他们为什么一个要叫锁,一个要叫信号量呢?
我的理解是: 锁是用来控制进程间的互斥的,而信号量是用来控制进程同步的。信号量可以用来控制访问同一个资源的线程数。
但是当我刚看到pthread中这两个概念的时候完全蒙圈,莫名奇妙的感觉这个和我们课程上学的不一样。实际上还是差不多的。
pthread_mutex_lock()和pthread_mutex_unlock,简单粗暴的来说,就是用来控制其中的某个全局变量只能被一个线程访问。这里的全局变量可能是一个条件变量(pthread_cond_t),也可以是其他的。
而pthread_cond_wait()就起到了解锁的作用(不解锁其他线程怎么可能进入临界区改变这个线程所等待的条件),但是又使线程为某个条件阻塞的功能(记住这个功能)。就像在管程中的线程可以暂时放弃对临界区的访问,使其阻塞在条件变量上。其实“阻塞在条件变量上”这个开始时让我有点难以理解,给人的感觉好像就是条件变量是个容器,把线程关在里面了。但是事实上的情况好像确实比较类似。另外,pthread_cond_wait()函数返回时,相应的互斥锁将被当前线程锁定,并且进程被唤醒。阻塞在条件变量上的线程被唤醒以后,直到pthread_cond_wait()函数返回之前条件的值都有可能发生变化。所以函数返回以后,在锁定相应的互斥锁之前,必须重新测试条件值。一个方法是循环调用pthread_cond_wait函数,即使进程不断阻塞,直到满足条件。
以后有机会可以了解一下这个锁和条件变量的底层设计,感觉还是很神奇的。
以上都是个人理解,如有错误请指正。
参考博客:https://blog.csdn.net/icechenbing/article/details/7662026