当前位置: 首页 > news >正文

2024.2.22

将互斥机制的代码实现

#include<myhead.h>
int num=7;
pthread_mutex_t mutex;//创建互斥锁变量
void *task1(void *arg)
{printf("task1:\n");//获取锁资源pthread_mutex_lock(&mutex);num=77777;sleep(2);
printf("task1:num=%d\n",num);
//释放锁资源
pthread_mutex_unlock(&mutex);
}
void *task2(void *arg)
{printf("task2:\n");//获取锁资源pthread_mutex_lock(&mutex);num=num+1;sleep(1);
printf("task2:num=%d\n",num);
//释放锁资源
pthread_mutex_unlock(&mutex);
}
int main(int argc, const char *argv[])
{//初始化互斥锁pthread_mutex_init(&mutex,NULL);//创建线程pthread_t tid1,tid2;if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 creat error");return 0;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid2 creat error");return 0;}//回收线程资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);//销毁锁资源pthread_mutex_destroy(&mutex);return 0;
}

将无名信号量的代码实现重新敲一遍

#include<myhead.h>
sem_t sem1;//创建无名信号量1void *task1(void *arg)
{int num=5;while(num--){printf("我生产了\n");sem_post(&sem1);//释放资源}pthread_exit(NULL);//退出线程
}
void *task2(void *arg)
{int num=5;while(num--){//申请资源sem_wait(&sem1);printf("我消费了\n");}pthread_exit(NULL);//退出线程
}
int main(int argc, const char *argv[])
{//初始化无名信号量sem_init(&sem1,0,0);pthread_t pid1,pid2;if(pthread_create(&pid1,NULL,task1,NULL)!=0){printf("pid1 create error\n");return 0;}if(pthread_create(&pid2,NULL,task2,NULL)!=0){printf("pid2 create error\n");return 0;}pthread_join(pid1,NULL);pthread_join(pid2,NULL);sem_destroy(&sem1);
return 0;
}

将条件变量的代码实现重新敲一遍

#include<myhead.h>
pthread_cond_t cond;
pthread_mutex_t mutex;
void *task1(void *arg)
{int num=5;while(num--){sleep(1);printf("%#lx:生产了一个\n",pthread_self());pthread_cond_signal(&cond);}pthread_exit(NULL);
}
void *task2(void *arg)
{pthread_mutex_lock(&mutex);pthread_cond_wait(&cond,&mutex);printf("%#lx:消费了一个\n",pthread_self());pthread_mutex_unlock(&mutex);pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//初始化条件变量pthread_cond_init(&cond,NULL);//初始化互斥锁pthread_mutex_init(&mutex,NULL);//创建线程pthread_t tid1,tid2,tid3,tid4,tid5,tid6;if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 create error\n");return 0;}
if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid1 create error\n");return 0;}
if(pthread_create(&tid3,NULL,task2,NULL)!=0){printf("tid1 create error\n");return 0;}
if(pthread_create(&tid4,NULL,task2,NULL)!=0){printf("tid1 create error\n");return 0;}
if(pthread_create(&tid5,NULL,task2,NULL)!=0){printf("tid1 create error\n");return 0;}
if(pthread_create(&tid6,NULL,task2,NULL)!=0){printf("tid1 create error\n");return 0;}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
pthread_join(tid4,NULL);
pthread_join(tid5,NULL);
pthread_join(tid6,NULL);
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&mutex);return 0;
}

将无名管道的代码实现重新敲一遍

#include<myhead.h>
sem_t sem1;//创建无名信号量1void *task1(void *arg)
{int num=5;while(num--){printf("我生产了\n");sem_post(&sem1);//释放资源}pthread_exit(NULL);//退出线程
}
void *task2(void *arg)
{int num=5;while(num--){//申请资源sem_wait(&sem1);printf("我消费了\n");}pthread_exit(NULL);//退出线程
}
int main(int argc, const char *argv[])
{//初始化无名信号量sem_init(&sem1,0,0);pthread_t pid1,pid2;if(pthread_create(&pid1,NULL,task1,NULL)!=0){printf("pid1 create error\n");return 0;}if(pthread_create(&pid2,NULL,task2,NULL)!=0){printf("pid2 create error\n");return 0;}pthread_join(pid1,NULL);pthread_join(pid2,NULL);sem_destroy(&sem1);
return 0;
}

将有名管道的代码实现重新敲一遍

name_creat.c#include<myhead.h>
int main(int argc, const char *argv[])
{//创建管道if(mkfifo("./myfifo",0664)==-1){perror("mkfifo error");return -1;}getchar();//阻塞system("rm myfifo");
return 0;
}write_namepipe.c #include<myhead.h>
int main(int argc, const char *argv[])
{//打开管道int wfd=-1;//只写打开文件if((wfd=open("./myfifo",O_WRONLY))==-1){perror("open error");return -1;}//定义容器char wbuf[128]="";while(1){printf("please input:\n");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;//将数据写入管道write(wfd,wbuf,strlen(wbuf));//判断是否退出if(strcmp(wbuf,"quit")==0){break;}close(wfd);return 0;}return 0;
}read_namepipe.c #include<myhead.h>
int main(int argc, const char *argv[])
{//打开管道文件int rfd=-1;//只读形式打开if((rfd=open("./myfifo",O_RDONLY))==-1){perror("open error");return -1;}//定义容器char rbuf[100]="";while(1){//清空bzero(rbuf,sizeof(rbuf));//读取管道中的数据read(rfd,rbuf,sizeof(rbuf));//输出结果printf("receive data is:%s\n",rbuf);//判断结果if(strcmp(rbuf,"quit")==0){break;}}close(rfd);
return 0;
}

相关文章:

  • RSA加密,解密,加签及验签
  • 解决IntelliJ IDEA 2023版本创建Spring项目时Java只能选择17或21的问题
  • 基于java Springboot实现教务管理系统
  • Window部署SkyWalking
  • Android TextView.setText() 引发的卡顿问题
  • c语言strtok的使用
  • 过滤器:Gateway GlobalFilter在分布式系统中的应用
  • 二叉树基础知识总结
  • 【JS逆向学习】补环境代理(Proxy)方法
  • 【数据结构】链式队列
  • FlinkSql一个简单的测试程序
  • Docker中部署flink集群的两种方式
  • SQL字符集
  • Web 前端 UI 框架Bootstrap简介与基本使用
  • 手拉手Vite+Vue3+TinyVue+Echarts+TailwindCSS
  • CAP 一致性协议及应用解析
  • java8 Stream Pipelines 浅析
  • js 实现textarea输入字数提示
  • leetcode98. Validate Binary Search Tree
  • Mysql5.6主从复制
  • Node 版本管理
  • 代理模式
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 精彩代码 vue.js
  • 前端临床手札——文件上传
  • 十年未变!安全,谁之责?(下)
  • 为视图添加丝滑的水波纹
  • AI算硅基生命吗,为什么?
  • ​Linux·i2c驱动架构​
  • #define、const、typedef的差别
  • #ifdef 的技巧用法
  • #WEB前端(HTML属性)
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (1)Nginx简介和安装教程
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (11)MATLAB PCA+SVM 人脸识别
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (ZT)出版业改革:该死的死,该生的生
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (动态规划)5. 最长回文子串 java解决
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)Neo4j下载安装以及初次使用
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET微信公众号开发-2.0创建自定义菜单
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @Autowired和@Resource装配
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)