关于pthread的锁以及条件变量的一点理解

最近在学线程池,所以会碰到这两个概念。

这里的锁指的是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

你可能感兴趣的:(项目基础)