POSIX---互斥锁(pthread_mutex)和条件变量(pthread_cond)的用法

来源:互联网 发布:杭州摄影俱乐部 知乎 编辑:程序博客网 时间:2024/06/02 05:09

条件变量是利用共享的全局变量进行同步的一种机制。

(1)创建

  动态创建

pthread_cond_t cond;

int pthread_cond_init (pthread_cond_t * cond,const pthread_condattr_t * attr);//动态调用API函数创建,attr设置属性,通常为NULL

静态创建

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

(2)注销

int pthread_cond_destroy(pthread_cond_t* cond);

(3)等待 使某线程挂起

int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex); // 条件等待

int pthread_cond_timeoutwait(pthread_cond_t* cond, pthread_mutex* mutex, const struct timespec* abstime); // 计时等待

为了防止竞争,条件变量通常跟互斥锁一起使用,当程序进入wait等待时后会将mutex进行解锁,当离开wait之前会重新上锁,所以使用wait等待函数前都必须给mutex上锁,wait函数等待结束后都的给mutex解锁!

(4)激发 激活某线程

  int pthread_cond_signal(pthread_cond_t* cond); //激活第一个调用wait函数进入睡眠等待的线程

int pthread_cond_broadcast(pthread_cond_t* cond); // 激活所有调用wait函数而进入睡眠的线程

eg:

  // 某段代码

..............

  while ( !pglobal->stop ) {
    /* wait for fresh frames */
    //pthread_cond_wait会对mutex进行解锁 如果是别的线程加的锁 在这里解会出问题 如果没锁 解锁也会出问题
    pthread_cond_wait(&pglobal->db_update, &pglobal->db);

    /* read buffer */
    frame_size = pglobal->size;

    /* check if framebuffer is large enough, increase it if necessary */
    if ( frame_size > max_frame_size ) {
      DBG("increasing buffer size to %d\n", frame_size);

      max_frame_size = frame_size+TEN_K;
      if ( (tmp = realloc(frame, max_frame_size)) == NULL ) {
        free(frame);
        pthread_mutex_unlock( &pglobal->db );
        send_error(fd, 500, "not enough memory");
        return;
      }

      frame = tmp;
    }

........

0 0
原创粉丝点击