zoukankan      html  css  js  c++  java
  • 多线程同步

                        多线程同步

    一、什么是同步

      多个线程按照规定的顺序来执行,即为线程同步。

          

    1.1线程同步方式一

      通过互斥锁的方式实现线程同步,可以实现但是执行效率比较低(sync.c)

     1 #include <stdio.h>
     2 #include <pthread.h>
     3 #include <string.h>  
     4 
     5 
     6 pthread_t thread[2];
     7 int number = 0;  
     8 pthread_mutex_t mut; 
     9 
    10 
    11 void studentA()
    12 {
    13     int i;
    14     for(i=0;i<5;i++)
    15     {  
    16         pthread_mutex_lock(&mut);
    17         //扫地
    18         number++;
    19         if( number>=5 )
    20             printf("student A has finish his work! 
    "); 
    21         
    22         pthread_mutex_unlock(&mut);    
    23         //休息1秒钟
    24         sleep(1);
    25     } 
    26     //退出 
    27     pthread_exit(NULL);
    28 }
    29 
    30 void studentB()
    31 {        
    32     while(1)
    33     {  
    34         pthread_mutex_lock(&mut);
    35         if(number>=5)    //判断A同学是否已经扫完5次地
    36         {   
    37             //执行拖地
    38             number = 0; 
    39             printf("student B has finish his work 
    ");
    40             
    41             pthread_mutex_unlock(&mut);
    42             //退出
    43             break;        
    44         } 
    45         else
    46         {  
    47             pthread_mutex_unlock(&mut);
    48             //睡眠2秒钟
    49             sleep(2);    
    50         }    
    51     }
    52     pthread_exit(NULL);  //退出
    53 }
    54 
    55 int main()
    56 {   
    57     //初始化互斥锁
    58     pthread_mutex_init(&mut,NULL);
    59 
    60     //创建A同学线程
    61     pthread_create(&thread[0],NULL,studentA,NULL);
    62     
    63     //创建B同学线程
    64     pthread_create(&thread[1],NULL,studentB,NULL);
    65         
    66     //等待A同学线程结束
    67     pthread_join(thread[0],NULL);
    68     
    69     //等待B同学线程结束
    70     pthread_join(thread[1],NULL);
    71         
    72     return 0;
    73 }

     1.2线程同步方式二

      使用条件变量,可以使CPU利用率提高(sync1.c)

     1 #include <stdio.h>
     2 #include <pthread.h>
     3 #include <string.h>  
     4 
     5 
     6 pthread_t thread[2];
     7 int number = 0;  
     8 pthread_mutex_t mut; 
     9 pthread_cond_t cond_ready=PTHREAD_COND_INITIALIZER;
    10 
    11 void studentA()
    12 {
    13     int i;
    14     for(i=0;i<5;i++)
    15     {  
    16         pthread_mutex_lock(&mut);
    17         //扫地
    18         number++;
    19         if( number>=5 )
    20         {
    21             printf("student A has finish his work! 
    "); 
    22             
    23             //通知B同学
    24             pthread_cond_signal(&cond_ready);  
    25         }    
    26         pthread_mutex_unlock(&mut);    
    27         //休息1秒钟
    28         sleep(1);
    29     } 
    30     //退出 
    31     pthread_exit(NULL);
    32 }
    33 
    34 void studentB()
    35 {        
    36 
    37     pthread_mutex_lock(&mut);
    38     if(number<5)
    39         pthread_cond_wait(&cond_ready, &mut);    
    40     number = 0;  
    41     pthread_mutex_unlock(&mut);
    42     printf("student B has finish his work! 
    "); 
    43     
    44     pthread_exit(NULL);  //退出
    45 }
    46 
    47 int main()
    48 {   
    49     //初始化互斥锁
    50     pthread_mutex_init(&mut,NULL);
    51 
    52     //创建A同学线程
    53     pthread_create(&thread[0],NULL,studentA,NULL);
    54     
    55     //创建B同学线程
    56     pthread_create(&thread[1],NULL,studentB,NULL);
    57         
    58     //等待A同学线程结束
    59     pthread_join(thread[0],NULL);
    60     
    61     //等待B同学线程结束
    62     pthread_join(thread[1],NULL);
    63         
    64     return 0;
    65 }

    1.3条件变量

    初始化:

      pthread_cond_t cond_ready=PTHREAD_COND_INITIALIZER;

    等待条件成熟:

      pthread_cond_wait(&cond_ready, &mut);

    设置条件成熟:

      pthread_cond_signal(&cond_ready);  

  • 相关阅读:
    js 小数取整的函数
    VS2015 Apache Cordova
    C# 标签(条码)
    异步提交form的时候利用jQuery validate实现表单验证
    调试javascript
    Chrome 控制台console的用法
    MvcPager分页控件以适用Bootstrap
    更好理解接口
    为什么上班一天都是坐着,但仍会疲惫不堪?(转)
    如何解决空虚感?(转)
  • 原文地址:https://www.cnblogs.com/wmx-learn/p/5305287.html
Copyright © 2011-2022 走看看