一、理解
条件变量(cond)是用来等待线程而不是上锁的,条件变量通常和互斥锁(mutex)一起使用。条件变量之所以要和互斥锁搭配使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不在,所以条件变量和互斥锁通常一起使用。
当条件满足时,线程通常解锁并等待该条件发生变化,一旦另一个线程修改了环境变量,就会通知相应的环境变量唤醒一个或多个被这个条件变量阻塞的线程。这些被唤醒的线程将重新上锁,并测试条件是否满足。一般来说,条件变量被用于线程间的同步;当条件不满足时,运行其中的一个执行流挂起和等待。
二、理解
条件变量是利用线程间共享的变量进行同步的一种机制,是在多线程程序中用来实现”等待 ->唤醒“逻辑常用的方法,用于维护一个条件(该条件是与条件变量不同的概念),线程可以使用条件变量来等待某个条件为真,注意理解:并不是等待条件变量为真!
条件变量是利用线程间共享的全局变量进行同步的一种机制(即,条件)。
当条件不满足时,线程将自己加入等待队列,同时释放持有的互斥锁;当一个线程唤醒一个或多个等待线程时,此时条件不一定为真(虚假唤醒)。
个人理解一
两个线程利用条件变量及互斥锁实现同步。条件变量和互斥锁对两个线程来说是全局的。
一个线程利用条件变量实现等待,同时释放锁。(一个线程等待”条件变量的条件成立“而挂起)
一个线程获取锁后利用该条件变量唤醒等待的线程。(另一个线程使”条件成立“而发出信号)
注意区分条件变量和条件:条件变量是用于同步的机制,条件是条件变量控制函数执行或等待的判断依据。
个人理解二
条件变量主要使用一种通知机制来让各个线程来处理临界资源,但为了保证线程安全,需要使得各个线程来互斥的访问临界资源。
如果没有互斥锁,则,
(1)调用条件变量通知函数唤醒所有的等待线程的话,很可能导致临界资源被多个线程重复处理,甚至导致错误的发生。因此,为了方便,每个线程被唤醒返回pthread_cond_wait()函数时,一般会对互斥锁加锁,这样其他被唤醒的线程只能阻塞等待此线程释放该互斥锁,从而实现互斥的对于临界资源的访问。
(2)当此线程处理完临界资源后,会在此调用pthread_cond_wait()函数,将该线程挂起至等待条件变量队列,然后释放互斥锁,让其他线程被唤醒继续处理该临界资源。
互斥锁和条件变量
1.互斥锁
互斥锁是用来保护临界区资源的,实际上保护的是临界区中被操纵的数据,互斥锁通常用于保护由多个线程或多个进程共享的数据。一般是一些可供线程间使用的全局变量,来达到线程同步的目的,即保证任何时刻只有一个线程或进程在执行其中的代码。一般加锁轮廓如下:
pthread_mutex_lock()
临界区
pthread_mutex_unlock()
1.1互斥锁API
(1)pthread_mutex_lock(pthread_mutex_t *mutex);
用此函数加锁时,如果mutex已经被锁住,当前尝试加锁的线程就会阻塞,直到互斥锁被其他线程释放。当此函数返回时,说明互斥锁已经被当前线程成功加锁。
(2)pthread_mutex_trylock(pthread_mutex_t *mutex);
用此函数加锁时,如果mutex已经卑琐主,当前尝试加锁的线程不会阻塞,而是立即返回,返回的错误码为EBUSY,而不是阻塞等待。
(3)pthread_mutex_unlock(pthread_mutex_t *mutex);
用此函数解锁。
2.条件变量
互斥锁用于加锁,条件变量用于等待。