线程中互斥锁mutex来实现同步

匿名 (未验证) 提交于 2019-12-03 00:40:02

pthread_mutex_init()函数用于创建一个互斥量,第一个参数指向互斥量的数据结构pthread_mutex_t的指针,第二个参数是定义互斥量属性的pthread_mutexattr_t结构的指针,他的默认类型是fast。类似于信号量的使用方法,pthread_mutex_lock()是对互斥量进行锁定操作,pthread_mutex_unlock()是对互斥量进行解锁操作,pthread_mutex_destroy()的作用是清除互斥量。


演示互斥量的操作方法

#include <stdio.h> #include <unistd.h> #include <pthread.h> #include <string.h> #include <stdlib.h> #include <semaphore.h>  void *thread_function(void *arg); pthread_mutex_t work_mutex;   //定义互斥量 #define WORK_SIZE 1024 char work_area[WORK_SIZE]; int time_to_exit=1;  int main () {     int res;     pthread_t a_thread;  //保存创建线程的返回值     void *thread_result; //结束线程的返回值     res=pthread_mutex_init(&work_mutex,NULL);  //创建初始化互斥量     if(res!=0)     {         perror("互斥量初始化失败");         exit(EXIT_FAILURE);     }     res=pthread_create(&a_thread,NULL,thread_function,NULL);     if(res!=0) {         perror("线程创建失败");         exit(EXIT_FAILURE);     }     pthread_mutex_lock(&work_mutex);  //锁定互斥量  //上锁     printf("请输入要传递的信息,输入end退出\n");     while(time_to_exit)     {         fgets(work_area,WORK_SIZE,stdin);         pthread_mutex_unlock(&work_mutex); //解除互斥锁         while(time_to_exit)         {             pthread_mutex_lock(&work_mutex);             if(work_area[0]!='\0')             {                 pthread_mutex_unlock(&work_mutex);                 sleep(1);             }             else {                 break;             }         }     }     pthread_mutex_unlock(&work_mutex);  printf("\n等待线程结束\n");     res=pthread_join(a_thread,&thread_result);     if(res!=0)     {         perror("结束线程创建失败");         exit(EXIT_FAILURE);     }     printf("线程结束\n");     pthread_mutex_destroy(&work_mutex);     exit(EXIT_SUCCESS); } void *thread_function(void *arg) {     sleep(1);     pthread_mutex_lock(&work_mutex);     while(strncmp("end",work_area,3)!=0)     {         printf("收到字符%d个\n",strlen(work_area)-1);         work_area[0]='\0';         pthread_mutex_unlock(&work_mutex);         sleep(1);         pthread_mutex_lock(&work_mutex);         while(work_area[0]=='\0')         {             pthread_mutex_unlock(&work_mutex);             sleep(1);               pthread_mutex_lock(&work_mutex);         }     }     time_to_exit=0;     work_area[0]='\0';     pthread_mutex_unlock(&work_mutex);     pthread_exit(0); }  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!