IO进程线程的通信操作

1.编程实现互斥机制

程序代码:

  1 #include<myhead.h>
  2 int num=520;//临界资源
  3 //1.创建一个互斥锁变量
  4 pthread_mutex_t mutex;//定义一个pthread_mutex_t类型的变量
  5 //定义任务1函数
  6 void *task1(void *arg)
  7 {
  8     printf("不畏过去\n");
  9     //获取锁资源
 10     pthread_mutex_lock(&mutex);//互斥锁地址
 11     num=1314;
 12     sleep(3);
 13     printf("task1:num=%d\n",num);
 14     //释放锁资源
 15     pthread_mutex_unlock(&mutex);//互斥锁地址
 16 }
 17 //定义任务2函数
 18 void *task2(void *arg)
 19 {
 20     printf("不惧将来\n");
 21     //获取锁资源
 22     pthread_mutex_lock(&mutex);
 23     num++;   //521
 24     sleep(1);  //休眠,执行任务一的赋值语句num=1314
 25     //遇到任务1中的互斥锁,回到这等休眠结束,执行任务二所有程序
 26     printf("task2:num=%d\n",num);
 27     //释放锁资源
 28     pthread_mutex_unlock(&mutex);
 29     //释放完再回到任务一的互斥锁位置,执行任务一所以程序
 30 }
 31 int main(int argc, const char *argv[])
 32 {
 33     //2.初始化互斥锁
 34     pthread_mutex_init(&mutex,NULL);//互斥锁地址,互斥锁属性,成败返回0
 35     //创建两个线程
 36     pthread_t tid1,tid2;//线程号变量
 37     if(pthread_create(&tid1,NULL,task1,NULL)!=0)
 38     //创建分支线程,成0败错误码(不是置位错误码)
 39    //线程号指针,线程属性,线程体(函数指针),线程体的参数
 40     {
 41         printf("tid1 create error\n");//是POSIX库错误码,不能用ferror()
 42         return 0;
 43     }
 44     if(pthread_create(&tid2,NULL,task2,NULL)!=0)
 45     {
 46         printf("tid2 create error\n");
 47         return 0;
 48     }
 49     printf("tid1:%#lx,tid2:%#lx\n",tid1,tid2);//线程号
 50     //回收线程资源
 51     pthread_join(tid1,NULL);//阻塞等待指定线程的退出,收尸,成0败错误码
 52     pthread_join(tid2,NULL);//要回收的线程号,要回收的线程退出时的状态,NULL
 53     //销毁锁资源
 54     pthread_mutex_destroy(&mutex);//互斥锁指针
 55     return 0;
 56 }  

运行结果:

2.编程实现无名信号量

(1)生产和销售

程序代码:

  1 #include<myhead.h>
  2 //1.创建无名信号量
  3 sem_t sem;//定义一个sem_t类型的变量
  4 //定义生产线程
  5 void *task1(void *arg)
  6 {
  7     int num=5;//定义循环量
  8     while(num--)
  9     {
 10         sleep(1);
 11         printf("生产三蹦子\n");
 12         //4.释放资源
 13         sem_post(&sem);//释放无名信号量资源,value加1,
 14         //无名信号量地址
 15     }
 16     //退出线程
 17     pthread_exit(NULL);//线程退出时状态,NULL
 18 }
 19 //定义消费线程
 20 void *task2(void *arg)
 21 {
 22     int num=5;
 23     while(num--)
 24     {
 25         //3.申请资源
 26         sem_wait(&sem);//申请资源,value减1,为0时阻塞,无名信号量地址
 27         printf("消费三蹦子\n");
 28     }
 29     pthread_exit(NULL);
 30 }
 31 int main(int argc, const char *argv[])
 32 {
 33     //2.初始化无名信号量
 34     sem_init(&sem,0,0);
 35     //无名信号量地址,0线程间同步,当前无名信号量维护的value值初始值
 36     //创建两个线程,生产和消费
 37     pthread_t tid1,tid2;
 38     if(pthread_create(&tid1,NULL,task1,NULL)!=0)
 39     //线程号指针,线程属性,线程体(函数体),线程体的参数
 40     //成0败POSIX库中错误码,不能perror()
 41     {
 42         printf("tid1 create error\n");
 43         return 0;
 44     }
 45     if(pthread_create(&tid2,NULL,task2,NULL)!=0)
 46     {
 47         printf("tid2 create error\n");
 48         return 0;
 49     }
 50     printf("tid1:%#lx,tid2:%#lx\n",tid1,tid2);
 51     //回收线程资源
 52     pthread_join(tid1,NULL);//阻塞等待指定线程退出,收尸
 53     pthread_join(tid2,NULL);//要回收的线程号、要回收线程退出时状态
 54     //释放无名信号量
 55     sem_destroy(&sem);//无名信号量地址
 56     return 0;
 57 } 

运行结果:

(2)创建三个线程,线程1打印A,线程2打印B,线程3打印C

程序代码:

  1 #include<myhead.h>
  2 //创建无名信号量
  3 sem_t sem1,sem2,sem3;
  4 //定义线程1
  5 void *task1(void *arg)
  6 {
  7     int num=3;
  8     while(num--)
  9     {
 10         //3.申请资源
 11         sem_wait(&sem1);
 12         sleep(1);
 13         printf("A\t");
 14         //刷新给定文件指针缓冲区,要刷新的缓冲区
 15         //stdout标准输出指针
 16         fflush(stdout);
 17         //4.释放资源
 18         sem_post(&sem2);//释放无名信号量sem2的资源,value加1
 19     }
 20     //退出线程
 21     pthread_exit(NULL);
 22 }
 23 //定义线程2
 24 void *task2(void *arg)
 25 {
 26     int num=3;
 27     while(num--)
 28     {
 29         sem_wait(&sem2);//sem2资源-1
 30         sleep(1);
 31         printf("B\t");
 32         fflush(stdout);//输出没有\n,不刷新不会打印出来,等全部运行结束直接给出结果
 33         sem_post(&sem3);//sem3资源+1,sem3才能接着用
 34     }
 35     pthread_exit(NULL);
 36 }
 37 //定义线程3
 38 void *task3(void *arg)
 39 {
 40     int num=3;
 41     while(num--)
 42     {
 43         //申请资源sem3
 44         sem_wait(&sem3);
 45         sleep(1);
 46         printf("C\t");
 47         fflush(stdout);
 48         sem_post(&sem1);//释放sem1资源,
 49     }
 50     pthread_exit(NULL);
 51 }
 52 int main(int argc, const char *argv[])
 53 {
 54     //初始化无名信号量
 55     sem_init(&sem1,0,1);//无名信号量地址
 56     sem_init(&sem2,0,0);//0线程同步
 57     sem_init(&sem3,0,0);//初始资源为1,0
 58     //定义线程号变量
 59     pthread_t tid1,tid2,tid3;
 60     if(pthread_create(&tid1,NULL,task1,NULL)!=0)//创建线程分支
 61     {
 62         printf("tid1 create error\n");
 63         return 0;
 64     }
 65     if(pthread_create(&tid2,NULL,task2,NULL)!=0)//无名信号量地址,线程属性,线程体,线程体参数
 66     {
 67         printf("tid2 create error\n");
 68         return 0;
 69     }
 70     if(pthread_create(&tid3,NULL,task3,NULL)!=0)
 71     {
 72         printf("tid3 create error\n");
 73         return 0;
 74     }
 75     printf("tid1:%#lx,tid2:%#lx,tid3:%#lx\n",tid1,tid2,tid3);
 76     //回收线程资源
 77     pthread_join(tid1,NULL);
 78     pthread_join(tid2,NULL);
 79     pthread_join(tid3,NULL);
 80     //释放无名信号量
 81     sem_destroy(&sem1);
 82     sem_destroy(&sem2);
 83     sem_destroy(&sem3);
 84     puts("");
 85     return 0;
 86 }    

运行结果:

3.编程实现条件变量

程序代码:

  1 #include<myhead.h>
  2 //1.定义条件变量
  3 pthread_cond_t cond;
  4 //定义互斥锁变量
  5 pthread_mutex_t mutex;
  6 //定义生产线程
  7 void *task1(void *arg)
  8 {
  9     int num=5;
 10     while(num--)
 11     {
 12         sleep(1);
 13         printf("%#lx:生产三蹦子\n",pthread_self());
 14         //3.唤醒一个消费
 15     //  pthread_cond_signal(&cond);//条件变量地址
 16     }
 17     //3.唤醒所以的等待线程
 18     pthread_cond_broadcast(&cond);//条件变量地址
 19     //退出线程
 20     pthread_exit(NULL);
 21 }
 22 //定义消费线程
 23 void *task2(void *arg)
 24 {
 25     //上锁
 26     pthread_mutex_lock(&mutex);
 27     //进入等待队列
 28     pthread_cond_wait(&cond,&mutex);//条件变量指针,互斥锁变量地址
 29     //该函数内部实现
 30     //将当前线程放入休眠等待队列,释放锁资源
 31     //挂起,被其他线程唤醒后:自动获取锁资源
 32     printf("%#lx:消费三蹦子\n",pthread_self());
 33     //解锁
 34     pthread_mutex_unlock(&mutex);
 35     pthread_exit(NULL);
 36 }
 37 int main(int argc, const char *argv[])
 38 {
 39     //2.初始化条件变量
 40     pthread_cond_init(&cond,NULL);//条件变量指针,条件属性
 41     //初始化互斥锁
 42     pthread_mutex_init(&mutex,NULL);//互斥锁变量地址,互斥锁属性
 43     //创建两个线程,生产和消费
 44     pthread_t tid1,tid2,tid3,tid4,tid5,tid6;
 45     if(pthread_create(&tid1,NULL,task1,NULL)!=0)//线程号指针
 46     {
 47         printf("tid1 create error\n");//成0败非0错误码,不是置位错误码
 48         return 0;
 49     }
 50     if(pthread_create(&tid2,NULL,task2,NULL)!=0)//线程属性
 51     {
 52         printf("tid2 create error\n");
 53         return 0;
 54     }
 55     if(pthread_create(&tid3,NULL,task2,NULL)!=0)//线程体,函数指针
 56     {
 57         printf("tid3 create error\n");
 58         return 0;
 59     }
 60     if(pthread_create(&tid4,NULL,task2,NULL)!=0)//线程体的参数
 61     {
 62         printf("tid4 create error\n");
 63         return 0;
 64     }
 65     if(pthread_create(&tid5,NULL,task2,NULL)!=0)
 66     {
 67         printf("tid5 create error\n");
 68         return 0;
 69     }
 70     if(pthread_create(&tid6,NULL,task2,NULL)!=0)
 71     {
 72         printf("tid6 create error\n");
 73         return 0;
 74     }
 75     printf("tid1:%#lx,tid2:%#lx,tid3:%#lx,tid4:%#lx,tid5:%#lx,\
 76             tid6:%#lx\n",tid1,tid2,tid3,tid4,tid5,tid6);
 77     //回收线程资源
 78     pthread_join(tid1,NULL);//线程号,线程回收时状态
 79     pthread_join(tid2,NULL);
 80     pthread_join(tid3,NULL);
 81     pthread_join(tid4,NULL);
 82     pthread_join(tid5,NULL);
 83     pthread_join(tid6,NULL);
 84     //销毁条件变量
 85     pthread_cond_destroy(&cond);//条件变量指针
 86     //销毁互斥锁
 87     pthread_mutex_destroy(&mutex);//无名信号量地址
 88     return 0;
 89 }      

运行结果:

4.编程实现无名管道

程序代码:

  1 #include<myhead.h>
  2 int main(int argc, const char *argv[])
  3 {
  4     //创建管道文件,并返回该管道文件的文件描述符
  5     int pipefd[2]={0};//返回pipefd[0]读端,pipefd[1]写端
  6     if(pipe(pipefd)==-1)
  7     {
  8         perror("pipe error");
  9         return -1;
 10     }
 11     printf("pipe[0]=%d,pipe[1]=%d\n",pipefd[0],pipefd[1]);
 12     //创建子进程
 13     pid_t pid=fork();
 14     if(pid>0)
 15     {
 16         //父进程
 17         //关闭管道读端
 18         //创建管道文件放在创建子进程之前,否则各自创建一个管道,无意义
 19         //父进程、子进程都创建同一个管道描述符,
 20         //要关闭父进程的读端,子进程的写端
 21         close(pipefd[0]);//pipefd[0]    读
 22         char wbuf[128]="";
 23         while(1)
 24         {
 25             bzero(wbuf,sizeof(wbuf));//清空数组内容,
 26             //每次写入不同长度,写短了就会保留长的一部分
 27             fgets(wbuf,sizeof(wbuf),stdin);//终端输入数据
 28             wbuf[strlen(wbuf)-1]=0;//把读取的字符串,最后一个改为0,便于比较
 29             //将数据写入管道文件
 30             write(pipefd[1],wbuf,strlen(wbuf));//要操作的文件描述符,容器起始位置,读取大小
 31             //对写入数据判断
 32             if(strcmp(wbuf,"quit")==0)
 33                 break;
 34         }
 35         //关闭写端
 36         close(pipefd[1]);
 37         wait(NULL);//阻塞回收子进程资源
 38     }else if(pid==0)
 39     {
 40         //子进程
 41         //关闭写端
 42         close(pipefd[1]);
 43         char rbuf[128]="";
 44         while(1)
 45         {
 46             //清空rbuf内容
 47             bzero(rbuf,sizeof(rbuf));
 48             //从管道文件中读取数据
 49             read(pipefd[0],rbuf,sizeof(rbuf));
 50             //输出rbuf的数据
 51             printf("父进程传来数据:%s\n",rbuf);
 52             //对读取的数据判断
 53             if(strcmp(rbuf,"quit")==0)
 54                 break;
 55         }
 56         //关闭读端
 57         close(pipefd[0]);
 58         exit(EXIT_SUCCESS);//退出进程
 59     }else
 60     {
 61         perror("fork error");
 62         return -1;
 63     }
 64     return 0;
 65 }     

运行结果:

5.编程实现有名管道

程序代码:

create.c:

  1 #include<myhead.h>
  2 int main(int argc, const char *argv[])
  3 {
  4     //创建一个管道文件
  5     if(mkfifo("./myfifo",0664)==-1)
  6     {
  7         perror("mkfifo error");
  8         return -1;
  9     }
 10     getchar();//阻塞
 11     system("rm myfifo");
 12 
 13     return 0;
 14 }   

send.c:

  1 #include<myhead.h>
  2 int main(int argc, const char *argv[])
  3 {
  4     //打开管道文件
  5     int wfd=-1;
  6     //以只写形式打开
  7     if((wfd=open("./myfifo",O_WRONLY))=
  8     {
  9         perror("open error");
 10         return -1;
 11     }
 12     //定义容器
 13     char wbuf[128]="";
 14     while(1)
 15     {
 16         printf("请输入>>>");
 17         fgets(wbuf,sizeof(wbuf),stdin);
 18         wbuf[strlen(wbuf)-1]=0;
 19         //将数据写入管道
 20         write(wfd,wbuf,strlen(wbuf));
 21         //判断结果
 22         if(strcmp(wbuf,"quit")==0)
 23             break;
 24     }
 25     //关闭文件
 26     close(wfd);
 27     return 0;
 28 }   

rec.c:

  1 #include<myhead.h>
  2 int main(int argc, const char *argv[])
  3 {
  4     //打开管道文件
  5     int rfd=-1;
  6     //以只读形式打开
  7     if((rfd=open("./myfifo",O_RDONLY))=
  8     {
  9         perror("open error");
 10         return -1;
 11     }
 12     //定义容器
 13     char rbuf[128]="";
 14     while(1)
 15     {
 16         //清空数组
 17         bzero(rbuf,sizeof(rbuf));
 18         //读取管道中数据
 19         read(rfd,rbuf,sizeof(rbuf));
 20         //输出结果
 21         printf("收到数据:%s\n",rbuf);
 22         if(strcmp(rbuf,"quit")==0)
 23             break;
 24     }
 25     //关闭文件
 26     close(rfd);
 27     return 0;
 28 }    

运行结果:

6.使用有名管道完成两个进程的相互通信

程序代码:

01create:

  1 #include<myhead.h>
  2 int main(int argc, const char *argv[])
  3 {
  4     //创建两个管道文件
  5     if(mkfifo("./myfifo1",0664)==-1)
  6     {
  7         perror("myfifo1 create error");
  8         return -1;
  9     }
 10     if(mkfifo("./myfifo2",0664)==-1)
 11     {
 12         perror("myfifo2 create error");
 13         return -1;
 14     }
 15     printf("create success\n");
 16     getchar();//阻塞进程
 17     system("rm myfifo1 myfifo2");//删除两>
 18     return 0;
 19 }

01send.c:

  1 #include<myhead.h>
  2 int main(int argc, const char *argv[])
  3 {
  4     //两个进程,父进程给管道1写数据,子进程从管道2读取数据
  5     pid_t pid=-1;
  6     pid=fork();
  7     if(pid==0)
  8     {
  9         //子进程管道2读取数据
 10         int rfd=-1;
 11         if((rfd=open("./myfifo2",O_RDONLY))==-1)
 12         {
 13             perror("open myfifo2 error");
 14             return -1;
 15         }
 16         char buf[128]="";
 17         while(1)
 18         {
 19             bzero(buf,sizeof(buf));//清空数组
 20             read(rfd,buf,sizeof(buf));//从管道2读取数据
 21             printf("读取数据:%s\n",buf);
 22             if(strcmp(buf,"quit")==0)
 23                 break;
 24         }
 25         //关闭文件
 26         close(rfd);
 27         //退出进程
 28         exit(EXIT_SUCCESS);
 29     }else if(pid>0)
 30     {
 31         //父进程向管道1写数据
 32         int wfd=-1;
 33         if((wfd=open("./myfifo1",O_WRONLY))==-1)
 34         {
 35             perror("open myfifo1 error");
 36             return -1;
 37         }
 38         char buf[128]="";
 39         while(1)
 40         {
 41             bzero(buf,sizeof(buf));//清空数组
 42             fgets(buf,sizeof(buf),stdin);
 43             buf[strlen(buf)-1]=0;
 44             //将数据写入管道
 45             write(wfd,buf,strlen(buf));
 46             if(strcmp(buf,"quit")==0)
 47                 break;
 48         }
 49         //关闭文件
 50         close(wfd);
 51         //回收子进程资源
 52         wait(NULL);
 53     }else
 54     {
 55         perror("fork error");
 56         return -1;
 57     }
 58     return 0;
 59 }         

02send.c:

  1 #include<myhead.h>
  2 int main(int argc, const char *argv[])
  3 {
  4     //两个进程,父进程读取管道1数据,子进程写数据给管道2
  5     pid_t pid=-1;
  6     pid=fork();
  7     if(pid<0)
  8     {
  9         perror("fork error");
 10         return -1;
 11     }else if(pid==0)
 12     {
 13         //子进程写数据给管道2
 14         int wfd=-1;
 15         if((wfd=open("./myfifo2",O_WRONLY))==-1)
 16         {
 17             perror("open myfifo2 error");
 18             return -1;
 19         }
 20         char buf[128]="";
 21         while(1)
 22         {
 23             bzero(buf,sizeof(buf));//清空数组
 24             fgets(buf,sizeof(buf),stdin);
 25             buf[strlen(buf)-1]=0;
 26             //写入数据
 27             write(wfd,buf,strlen(buf));
 28             if(strcmp(buf,"quit")==0)
 29                 break;
 30         }
 31         //关闭文件
 32         close(wfd);
 33         //退出进程
 34         exit(EXIT_SUCCESS);
 35     }else
 36     {
 37         //父进程读取管道1
 38         int rfd=-1;
 39         if((rfd=open("./myfifo1",O_RDONLY))==-1)
 40         {
 41             perror("open myfifo1 error");
 42             return -1;
 43         }
 44         char buf[128]="";
 45         while(1)
 46         {
 47             bzero(buf,sizeof(buf));
 48             //读取数据
 49             read(rfd,buf,sizeof(buf));
 50             printf("读取数据:%s\n",buf);                             
 51             if(strcmp(buf,"quit")==0)
 52                 break;
 53         }
 54         //关闭文件
 55         close(rfd);
 56         wait(NULL);//回收子进程资源
 57     }
 58     return 0;
 59 }

运行结果:

流程图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/404900.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java面试题之mybatis篇

什么是ORM&#xff1f; ORM&#xff08;Object/Relational Mapping&#xff09;即对象关系映射&#xff0c;是一种数据持久化技术。它在对象模型和关系型数据库直接建立起对应关系&#xff0c;并且提供一种机制&#xff0c;通过JavaBean对象去操作数据库表的数据。 MyBatis通过…

驾校预约|驾校预约小程序|基于微信小程序的驾校预约平台设计与实现(源码+数据库+文档)

驾校预约小程序目录 目录 基于微信小程序的驾校预约平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户​微信端功能模块​ 2、管理员服务端功能模块 &#xff08;1&#xff09;学员信息管理 &#xff08;2&#xff09; 教练信息管理 &#xff08;3&…

Django学习笔记-HTML实现服务器图片的下载

1.index编写代码,跳转下载页面 2.创建download界面 3.编写download路由 4.创建download函数 1).如果请求的方法是GET&#xff0c;imglist变量存储从models.imgModel模型中获取的所有对象,创建字典ctx,使用render函数来渲染download.htm 2).如果请求的方法是POST,获取要下载的文…

Spring学习上下文【ConfigurableApplicationContext】

话不多说&#xff0c;先上图&#xff1a; ConfigurableApplicationContext是Spring框架中的一个接口&#xff0c;它继承了ApplicationContext接口&#xff0c;并扩展了一些额外的方法&#xff0c;用于允许应用程序在运行时动态地修改和管理应用上下文。ConfigurableApplicati…

【js】无限虚拟列表的原理及实现

什么是虚拟列表 虚拟列表是长列表按需显示思路的一种实现&#xff0c;即虚拟列表是一种根据滚动容器元素的可视区域来渲染长列表数据中某一个部分数据的技术。 简而言之&#xff0c;虚拟列表指的就是「可视区域渲染」的列表。有三个概念需要了解一下&#xff1a; 视口容器元…

KDD 2023 图神经网络方向论文总结

ACM SIGKDD&#xff08;国际数据挖掘与知识发现大会&#xff0c;KDD&#xff09;是数据挖掘领域历史最悠久、规模最大的国际顶级学术会议&#xff0c;也是首个引入大数据、数据科学、预测分析、众包等概念的会议。今年&#xff0c;第29届 KDD 大会在美国加州长滩举行&#xff0…

冒泡排序法的名字由来,排序步骤是什么,最坏情况下的排序次数如何计算得来的呢?

问题描述&#xff1a;冒泡排序法的名字由来&#xff0c;排序步骤是什么&#xff0c;最坏情况下的排序次数如何计算得来的呢&#xff1f; 问题解答&#xff1a; 冒泡排序法的名字来源于排序过程中较大的元素会像气泡一样逐渐“冒”到序列的顶端&#xff0c;而较小的元素则会逐…

代码随想录算法训练营第四十天 343. 整数拆分、 96.不同的二叉搜索树

代码随想录算法训练营第四十天 | 343. 整数拆分、 96.不同的二叉搜索树 343. 整数拆分 题目链接&#xff1a;343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 例如 n 10, 可以拆分为 3 * dp[7] 。因为dp[7]之前已经计算过最大 3 * 4&#xff0c; 所以dp[10] 3 * 3 …

Microsoft 365自定义安装软件

如图&#xff0c;在安装类型的步骤的时候&#xff0c;可以勾选自己想要的软件&#xff08;而非一股脑儿的安装一大堆自己不需要的&#xff09;。

AI绘画巅峰对决:Stable Diffusion 3与DALL·E 3原理深度比较

最近&#xff0c;Stable Diffusion 3 的预览版已经亮相啦&#xff01; 虽然这个AI绘画模型还没全面上线&#xff0c;但官方已经开启预览申请通道了。 https://stability.ai/stablediffusion3 而且好消息是&#xff0c;后面还会推出开源版本哦&#xff01; 这个模型套件真的…

五种多目标优化算法(MOAHA、MOGWO、NSWOA、MOPSO、NSGA2)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 多目标优化算法是用于解决具有多个目标函数的优化问题的一类算法。其求解流程通常包括以下几个步骤&#xff1a; 1. 定义问题&#xff1a;首先需要明确问题的目标函数和约束条件。多目标优化问题通常涉及多个目标函数&#xff0c;这些目标函数可能…

基于SpringBoot的产业园区智慧公寓管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

这才开工没几天收到Offer了,简历改的好,找工作没烦恼。

喜报喜报 这才开工没几天&#xff0c;就收到了喜报&#xff01; 就像上面截图中所说的一样&#xff1a;简历改了真的有用。 我也和大家分享一下优化简历的技巧&#xff0c;希望对大家有帮助&#xff0c;把握住金三银四的机会&#xff0c;都能顺利上岸&#xff0c;升职加薪&am…

多数pythoneer只知有列表list却不知道python也有array数组

数组和列表 Python中数组和列表是不同的&#xff0c;我敢断言大多数的pythoneer只知道有列表list&#xff0c;却不知道python也有array数组。列表是一个包含不同数据类型的元素集合&#xff0c;而数组是一个只能含相同数据类型的元素集合。 Python的array库是一个提供数组操作…

Android 广播的基本概念

一.广播简介 Broadcast是安卓四大组件之一。安卓为了方便进行系统级别的消息通知&#xff0c;引入了一套广播消息机制。打个比方&#xff0c;记得原来在上课的时候&#xff0c;每个班级的教室里都会装有一个喇叭&#xff0c;这些喇叭都是接入到学校的广播室的&#xff0c;一旦…

【初始RabbitMQ】交换机的实现

交换机概念 RabbitMQ消息传递模型的核心思想就是&#xff1a;生产者生产的消息从不会直接发送到队列。实际上&#xff0c;通常生产者不知道这些消息会传递到那些队列中 相反&#xff0c;生产者只能将消息发送到交换机&#xff0c;交换机的工作内容也很简单&#xff0c;一方面…

网络安全8-11天笔记

内容安全&#xff1a; 攻击可能只是一个点&#xff0c;防御需要全方面进行。 IAE引擎&#xff1a; DFI和DPI技术&#xff1a;深度检测技术 DPI——深度包检测技术&#xff1a;主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之…

Linux--自定义shell

shell shell就是操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口&#xff0c;用户可以通过输入命令来执行各种操作&#xff0c;如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。 常见的Unix系统中使…

http相关概念以及apache的功能(最详细讲解!!!!)

概念 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络 万维网&#xff1a;www &#xff08;不是网络&#xff0c;而是数据库&#xff09;是网页与网页之间的跳转关系 URL:万维网使用统一资源定位符&#xff0c;…

图片如何降低kb?这个方法很方便

图片体积过大的话&#xff0c;有两种最简单的方法可以解决&#xff0c;最直接的就是压缩图片大小&#xff0c;降低图片kb&#xff0c;再就是修改图片尺寸让图片体积变小&#xff0c;这两种操作方式都可以在本文介绍的这款图片处理工具中完成&#xff0c;图片压缩对我们来说最主…