zoukankan      html  css  js  c++  java
  • 【Linux 编程】pthead_cond_t 的使用

    pthead_cond_t 的使用
    源代码1
     1 #include <stdio.h>
     2  #include <pthread.h>
     3  #include <stdlib.h>
     4  #include <unistd.h>
     5  
     6  pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
     7  pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
     8  int constant = 0;
     9  
    10  void *prints(void *arg)
    11  {
    12      pthread_mutex_lock(&qlock);
    13      pthread_t tid = pthread_self();
    14      while (constant <10)
    15      {
    16          pthread_cond_wait(&qready, &qlock);
    17      }
    18      printf("After while thread %u, Constant is %d\n", 
    19              (unsigned int)tid, constant);
    20      pthread_mutex_unlock(&qlock);
    21      pthread_exit((void *)tid);
    22  }
    23  
    24  void *incre(void *arg)
    25  {
    26      pthread_mutex_lock(&qlock);
    27      pthread_t tid = pthread_self();
    28      while ( ++constant < 20)
    29      {
    30          printf("In while thread %u, Constant is %d\n", 
    31              (unsigned int)tid, constant);
    32              
    33          if (constant == 10) {   // 注意这里
    34              pthread_mutex_unlock(&qlock);
    35              pthread_cond_signal(&qready);
    36              pthread_mutex_lock(&qlock);
    37          }
    38      }
    39      printf("Now the constant is %d\n", constant);
    40      /*
    41      constant += 10;
    42      if (constant == 10)
    43          pthread_cond_signal(&qready);
    44      */
    45      pthread_mutex_unlock(&qlock);
    46      
    47      pthread_exit((void *)tid);
    48  }
    49  
    50  int main()
    51  {
    52      int err;
    53      pthread_t tid0, tid1;
    54  
    55      err = pthread_create(&tid0, NULL, prints, NULL);
    56      if (err != 0)
    57      {
    58          printf("can't create thread: %d \n", strerror(err));
    59          exit(0);
    60      }
    61      
    62      sleep(1);
    63      err = pthread_create(&tid1, NULL, incre, NULL);
    64      if (err != 0)
    65      {
    66          printf("can't create thread: %d \n", strerror(err));
    67          exit(0);
    68      }
    69      sleep(1);
    70      
    71      exit(0);
    72  }
    View Code

    运行结果1

     
    源代码2
     1 #include <stdio.h>
     2  #include <pthread.h>
     3  #include <stdlib.h>
     4  #include <unistd.h>
     5  
     6  pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
     7  pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
     8  int constant = 0;
     9  
    10  void *prints(void *arg)
    11  {
    12      pthread_mutex_lock(&qlock);
    13      pthread_t tid = pthread_self();
    14      while (constant <10)
    15      {
    16                  
    17          pthread_cond_wait(&qready, &qlock);
    18      }
    19      printf("After while thread %u, Constant is %d\n", 
    20              (unsigned int)tid, constant);
    21      pthread_mutex_unlock(&qlock);
    22      pthread_exit((void *)tid);
    23  }
    24  
    25  void *incre(void *arg)
    26  {
    27      pthread_mutex_lock(&qlock);
    28      pthread_t tid = pthread_self();
    29      while ( ++constant < 20)
    30      {
    31          printf("In while thread %u, Constant is %d\n", 
    32              (unsigned int)tid, constant);
    33              
    34          if (constant == 10) {    // 注意这里
    35      //        pthread_mutex_unlock(&qlock);
    36              pthread_cond_signal(&qready);
    37      //        pthread_mutex_lock(&qlock);
    38          }
    39      }
    40      printf("Now the constant is %d\n", constant);
    41      /*
    42      constant += 10;
    43      if (constant == 10)
    44          pthread_cond_signal(&qready);
    45      */
    46      pthread_mutex_unlock(&qlock);
    47      
    48      pthread_exit((void *)tid);
    49  }
    50  
    51  int main()
    52  {
    53      int err;
    54      pthread_t tid0, tid1;
    55  
    56      err = pthread_create(&tid0, NULL, prints, NULL);
    57      if (err != 0)
    58      {
    59          printf("can't create thread: %d \n", strerror(err));
    60          exit(0);
    61      }
    62      
    63      sleep(1);
    64      err = pthread_create(&tid1, NULL, incre, NULL);
    65      if (err != 0)
    66      {
    67          printf("can't create thread: %d \n", strerror(err));
    68          exit(0);
    69      }
    70      sleep(1);
    71      
    72      exit(0);
    73  }
    View Code
    运行结果
     
      其中,虽然函数pthread_wait_cond()之前,该线程已经持有锁。但是在该函数阻塞时,将释放掉锁。因此,只有只有锁的线程释放掉,才能继续从pthread_wait_cond()之后执行,因为该函数将再次获得锁的控制权。
  • 相关阅读:
    C#的几种下载文件方法
    分享下常用的网站
    C#操作XML文件
    MySQL截取字符串函数方法
    NLog使用方法
    弹出div提示框,背景变黑
    有关URL编码问题
    javascript 压缩工具
    [C#][Windows API] 常用Windows原生方法整理(Windows API) (不定期更新: 06/16)【转】
    An Introduction to IDS
  • 原文地址:https://www.cnblogs.com/life91/p/3101009.html
Copyright © 2011-2022 走看看