unix互斥锁与信号量应用例子



  1. #include 
  2. #include 
  3. #include 
  4. #include 
  5. #include 
  6. #include 
  7.  
  8. #define SIZE 3 
  9. #define STR_SIZE 20 
  10.  
  11. pthread_mutex_t mutex; //全局变量对main 及 线程函数都可见
  12. sem_t read_sem, write_sem; //全局变量对main 及 线程函数都可见
  13.  
  14. struct _buf_ 
  15. { 
  16.     char* buf[SIZE]; 
  17.     int front, rear; 
  18. }buffer; //循环队列结构体
  19.  
  20. void thread(void) 
  21. { 
  22.     while(1) 
  23.     { 
  24.         if(0 != sem_wait(&read_sem)) 
  25.         { 
  26.             perror("sem_wait_0"); 
  27.             exit(1); 
  28.         } 
  29.      
  30.         if(0 != pthread_mutex_lock(&mutex)) 
  31.         { 
  32.             perror("pthread_mutex_lock_0"); 
  33.             exit(1); 
  34.         } 
  35.      
  36.         fputs("output characters:\n",stdout); 
  37.      
  38.         fputs(buffer.buf[buffer.front],stdout); 
  39.      
  40.         buffer.front = (buffer.front + 1) % SIZE; 
  41.      
  42.         if(0 != pthread_mutex_unlock(&mutex)) 
  43.         { 
  44.             perror("pthread_mutex_lock_0"); 
  45.             exit(1); 
  46.         } 
  47.         if(0 != sem_post(&write_sem)) 
  48.         { 
  49.             perror("sem_wait_0"); 
  50.             exit(1); 
  51.         } 
  52.      
  53.         sleep(10); 
  54.     } 
  55.      
  56. } 
  57.  
  58. int main(void) 
  59. { 
  60.     //初始化循环队列结构体 
  61.     int i; 
  62.     bufferbuffer.front = buffer.rear = 0; 
  63.     for(i=0; i < SIZE; i++) 
  64.     { 
  65.         buffer.buf[i] =(char*) malloc(STR_SIZE); 
  66.     } 
  67.     //初始化 互斥锁 
  68.     //存在警告 pthread_mutexattr_t mutex_attr = PTHREAD_MUTEX_INITIALIZER; 
  69.      
  70.     if(0 != pthread_mutex_init(&mutex, NULL)) 
  71.     { 
  72.         perror("pthread_mutex_init\n"); 
  73.         exit(1); 
  74.     } 
  75.      
  76.     //初始化信号量 
  77.      
  78.     if(0 != sem_init(&read_sem, 0, 0))//linux进程间的信号共享还未能实现,参数PSHARE为0,而且还没有进行写操作没有数据可读,将参数vaule设置为0,进行阻塞 
  79.     { 
  80.         perror("sem_init_0\n"); 
  81.         exit(1); 
  82.     } 
  83.      
  84.     if(0 != sem_init(&write_sem, 0, 2)) 
  85.     { 
  86.         perror("sem_init_1\n"); 
  87.         exit(1); 
  88.     } 
  89.     //创建两个子线程 
  90.     pthread_t thd0,thd1; 
  91.      
  92.     if(0 != pthread_create(&thd0,NULL,(void*)thread,NULL)) 
  93.     { 
  94.         perror("pthread_create_0\n"); 
  95.         exit(1); 
  96.     } 
  97.      
  98.     if(0 != pthread_create(&thd1,NULL,(void*)thread,NULL)) 
  99.     { 
  100.         perror("pthread_create_1\n"); 
  101.         exit(1); 
  102.     } 
  103.      
  104.     //进行写入字符操作 
  105.     while(1) 
  106.     { 
  107.         //写信号量阻塞 
  108.         if(0 != sem_wait(&write_sem)) 
  109.         { 
  110.             perror("sem_wait_1"); 
  111.             exit(1); 
  112.         } 
  113.         //上互斥锁所进行写入操作 
  114.         if(0 != pthread_mutex_lock(&mutex)) 
  115.         { 
  116.             perror("pthread_mutex_lock_1"); 
  117.             exit(1); 
  118.         } 
  119.          
  120.         fputs("pls enter 20 character:\n",stdout); 
  121.          
  122.         //读标准输入文件 
  123.         if(NULL == fgets(buffer.buf[buffer.rear],STR_SIZE,stdin)) 
  124.         { 
  125.             perror("fgets\n"); 
  126.             exit(1); 
  127.         } 
  128.          
  129.         if(0 == strncmp("end\n",buffer.buf[buffer.rear],3)) 
  130.         { 
  131.             printf("manual exit successfully\n"); 
  132.             exit(1); 
  133.         } 
  134.          
  135.         buffer.rear = (buffer.rear+1)% SIZE; 
  136.         //解互斥锁 
  137.         if(0 != pthread_mutex_unlock(&mutex)) 
  138.         { 
  139.             perror("pthread_mutex_lock_1"); 
  140.             exit(1); 
  141.         } 
  142.          
  143.         if(0 != sem_post(&read_sem)) 
  144.         { 
  145.             perror("sem_wait_1"); 
  146.             exit(1); 
  147.         } 
  148.          
  149.         sleep(1); 
  150.      
  151.     } 
  152.      
  153.      
  154.  
  155.     return 0; 
  156. } 

 

网站建设哪家好,找创新互联公司!专注于网页设计、网站建设、微信开发、微信小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了仪陇免费建站欢迎大家使用!

附件:http://down.51cto.com/data/2362161

文章名称:unix互斥锁与信号量应用例子
本文地址:http://www.jxruijie.cn/article/pepgcc.html