linux操作系统之条件变量

(1)条件变量

               条件变量本身不是锁,但它可以造成线程阻塞,通常与互斥锁配合使用。

(2)条件锁相关函数

              pthread_cond_t类型,用于定义条件变量

         1)初始化一个条件变量:pthread_cond_init

                 int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);

               参数2:条件变量的属性,传NULL即可,为默认值

               可采用静态初始化:pthread _cond_t cond=PTHREAD_COND_INITIALIZER;

         2)销毁一个条件变量:pthread_cond_destroy

                int pthread_cond_destroy(pthread_cond_t *cond);

         3)阻塞等待条件变量:pthread_cond_wait(配合互斥锁使用)

                int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);

                函数作用: 

                           1>阻塞等待条件变量cond满足。

                           2>释放已掌握的互斥锁(解锁互斥量)相当于pthread_mutex_unlock(&mutex); 

                                           第1,2步为一个原子操作

                          3>当被唤醒,pthread_cond_wait函数返回,解除阻塞并重新获得互斥锁pthread_mutex_lock(&mutex)

         4)限时等待一个条件变量(以绝对时间等待):pthread_cond_timewait

                int pthread_cond_timewait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,condt struct timespec*restrcit abstime);

             struct timespec{

                          time_t tv_sec;//秒

                         long    tv_nsec;//纳秒

              };

 abstime;绝对时间,通过time(NULL)函数获取;

          5)唤醒至少一个阻塞在条件变量上的线程:pthread_cond_signal

               int pthread_cond_signal(pthread_cond_t *cond);

        6)唤醒全部阻塞在条件变量上的线程:pthread_cond_broadcast(pthread_cond_t  *cond);

(3)线程同步之生产者消费者变量模型

          假定有两个线程,一个模拟生产者行为,一个模拟消费者行为。两个线程同时操作一个共享资源(汇聚),生产者生产产品,消费者消费产品。

        linux操作系统之条件变量_第1张图片

linux操作系统之条件变量_第2张图片

       linux操作系统之条件变量_第3张图片

                

 

你可能感兴趣的:(操作系统)