有个大神写得非常好,我复述一下(哎,我只适合当一个复读机,希望我等下能提出一些自己的见解)
假设有两个线程同时访问一个全局变量n,这个变量的初始值为0,即int n = 0;
规则:
当消费者线程a进入临界区访问n,a必须要等到n > 0才会继续向下执行至离开临界区,如果n == 0,那么a将会在当前阻塞
当生成者线程b进入临界区访问n时,b将会修改n的值,使得n > 0,然后线程b将会唤醒处于阻塞态的消费者线程a,a被唤醒后将会继续往下执行
显然,这存在死锁的情况,因为当消费者线程a访问临界区n,如果n == 0,那么a将会停留在临界区,生产者线程因此也就无法进入临界区,n的值也就无法被修改,死锁出现
解决这一问题的办法就是采用条件变量
消费者在无法继续往下执行的时候,依然没有是否锁,也依然没有离开临界区,所以我们从这里下手
消费者进入临界区访问 > 发现临界资源不满足继续往下执行的条件 > 消费释放锁离开临界区同时等待在条件变量上(就是消费者线程依然会处于阻塞态,但是不是在临界区中阻塞)消费者线程执行pthread_cond_wait(&condition, *mutex) > 生产者线程拿到锁,进入临界区,修改共享资源(生产),生产者线程通过执行pthread_cond_signal 函数来唤醒消费者线程,同时生产者线程释放锁 > 消费者线程获得锁,访问临界区,释放锁。
pthread_mutex_t 和 pthread_cond_t
最新推荐文章于 2022-05-11 00:15:14 发布