linux条件锁

互斥锁常用函数:

互斥锁的操作主要包括以下几个步骤。
互斥锁初始化:pthread_mutex_init
互斥锁上锁:pthread_mutex_lock
互斥锁判断上锁:pthread_mutex_trylock
互斥锁接锁:pthread_mutex_unlock
消除互斥锁:pthread_mutex_destroy

条件变量常用函数:

 int pthread_condattr_init(pthread_condattr_t *attr);
int pthread_condattr_destroy(pthread_condattr_t *attr);
pthread_condattr_getpshared函数在由valptr指向的整数中返回这个属性的当前值,
pthread_condattr_setpshared则根据value的值设置这个属性的当前值。value的值可以是PTHREAD_PROCESS_PRIVATE或PTHREAD_PROCESS_SHARED(进程间共享).

 等待线程

  1。使用pthread_cond_wait前要先加锁
  2。pthread_cond_wait内部会解锁,然后等待条件变量被其它线程激活(处于阻塞)。
  3。pthread_cond_wait被激活后会再自动加锁

  激活线程:
  1。加锁(和等待线程用同一个锁)
  2。pthread_cond_signal发送信号
  3。解锁
  激活线程的上面三个操作在运行时间上都在等待线程的pthread_cond_wait函数内部。
  程序示例:
  #include <stdio.h>
  #include <pthread.h>
  #include <unistd.h>
  pthread_mutex_t count_lock;
  pthread_cond_t count_nonzero;
  unsigned count = 0;
  void * decrement_count(void *arg) {
    pthread_mutex_lock (&count_lock);
    printf("decrement_count get count_lock\n");
    while(count==0) {
    printf("decrement_count count == 0 \n");
    printf("decrement_count before cond_wait \n");
    pthread_cond_wait( &count_nonzero, &count_lock);
    printf("decrement_count after cond_wait \n");
  }
    count = count -1;
    pthread_mutex_unlock (&count_lock);
  }

  void * increment_count(void *arg){
    pthread_mutex_lock(&count_lock);
    printf("increment_count get count_lock\n");
    if(count==0) {
    printf("increment_count before cond_signal\n");
    pthread_cond_signal(&count_nonzero);
    printf("increment_count after cond_signal\n");
   }
   count=count+1;
   pthread_mutex_unlock(&count_lock);

  }

  int main(void)
  {
    pthread_t tid1,tid2;
    pthread_mutex_init(&count_lock,NULL);
    pthread_cond_init(&count_nonzero,NULL);
    pthread_create(&tid1,NULL,decrement_count,NULL);
    sleep(2);
    pthread_create(&tid2,NULL,increment_count,NULL);
    sleep(10);
    pthread_exit(0);
  }

 

你可能感兴趣的:(linux,null,Signal)