当前位置:网站首页>IO process thread -> thread -> day5
IO process thread -> thread -> day5
2022-08-03 04:42:00 【Whale calls me to take care of the sea QAQ】
目录
二、Thread code to copy pictures
练习
1. 定义一个全局变量,char str[] = "123456",Two threads are required to be defined:线程A, 线程B
1). 要求AThe thread loop prints the global stringstr;
2). 要求BThe thread loop inverts the global stringstr:将strThe contents of are inverted as "654321",Inverted to"123456"....
注意:It is printed upside down, not upside down
3). 要求A线程打印出的str字符串内容为;123456或者654321.Out of order is not allowed,例如:623451 653451,,,、
2. Requires two threads to copy an image,AThe thread copies the first half,BThe thread copies the second half,不允许使用sleep函数,不允许使用flag.
一、Invert the thread
定义一个全局变量,char str[] = "123456",Two threads are required to be defined:线程A, 线程B
1. 要求AThe thread loop prints the global stringstr;
2. 要求BThe thread loop inverts the global stringstr:将strThe contents of are inverted as "654321",Inverted to"123456"....
注意:It is printed upside down, not upside down
3. 要求A线程打印出的str字符串内容为:123456或者654321
This time, a mutex is used
1.1 函数
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
char str[]="123456";
pthread_mutex_t mutex;
void* callback1(void* arg)
{
pthread_detach(pthread_self());
int len=strlen(str);
char temp;
while(1)
{
pthread_mutex_lock(&mutex);
for(int i=0;i<len/2;i++)
{
temp=str[i];
str[i]=str[len-i-1];
str[len-i-1]=temp;
}
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void* callback2(void* arg)
{
pthread_detach(pthread_self());
while(1)
{
pthread_mutex_lock(&mutex);
printf("str=%s\n",str);
pthread_mutex_unlock(&mutex);
}
}
int main(int argc, const char *argv[])
{
printf("程序开始\n");
if(pthread_mutex_init(&mutex,NULL) != 0)
{
perror("pthread_mutex_init");
return -1;
}
pthread_t tid1,tid2;
printf("The mutex was created successfully\n");
//创建线程
if(pthread_create(&tid1,NULL,callback1,NULL) != 0)
{
perror("pthread_create");
return -1;
}
if(pthread_create(&tid2,NULL,callback2,NULL) != 0)
{
perror("pthread_create");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
1.2 执行结果

二、Thread code to copy pictures
The difficulty lies in the created threadA与B,Not sure which one executes first,会导致,Only half of it will be copied.
I will create it firstA,等A执行完后,再创建B,再执行.
should be put in the codefd_r和fd_w定义成全局变量,This only needs to be executed in the main functionopen(打开文件)一次就好了,But I modified it for a long time to execute the result,不想再改了,Please modify as necessary.
2.1 函数
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
pthread_mutex_t mutex; //The variable that stores the mutex
char buf; //The variable used for storage when reading the file
void* cpy1(void* arg)
{
pthread_detach(pthread_self()); //自己分离自己,等线程退出后,Automatically reclaim thread resources
pthread_mutex_lock(&mutex); //上锁
int fd_r=open("./1.png",O_RDONLY);
int fd_w=open("./cpy.png",O_RDWR | O_CREAT | O_APPEND,0777);
if(fd_r<0 || fd_w<0)
{
perror("open");
return NULL;
}
off_t len=lseek(fd_r,0,SEEK_END);
printf("len=%ld\n",len);
lseek(fd_r,0,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
for(int i=0;i<len/2;i++)
{
if(read(fd_r,&buf,1) <= 0)
{
perror("read");
return NULL;
}
write(fd_w,&buf,1);
}
close(fd_r);
close(fd_w);
pthread_mutex_unlock(&mutex); //解锁
pthread_exit(NULL); //结束线程
}
void* cpy2(void* arg)
{
pthread_detach(pthread_self());
pthread_mutex_lock(&mutex);
int fd_r=open("./1.png",O_RDONLY);
int fd_w=open("./cpy.png",O_RDWR | O_CREAT | O_APPEND,0777);
if(fd_r<0 || fd_w<0)
{
perror("open");
return NULL;
}
off_t len=lseek(fd_r,0,SEEK_END);
printf("len=%ld\n",len);
lseek(fd_r,len/2,SEEK_SET);
lseek(fd_w,len/2,SEEK_SET);
for(int i=len/2;i<len;i++)
{
if(read(fd_r,&buf,1) <= 0)
{
perror("read");
return NULL;
}
write(fd_w,&buf,1);
}
close(fd_r);
close(fd_w);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
2.2 执行结果

边栏推荐
- 6.神经网络剖析
- excerpt from compilation book
- GIS数据漫谈(六)— 投影坐标系统
- Get the Ip tool class
- 13.机器学习基础:数据预处理与特征工程
- Technology Sharing | How to do assertion verification for xml format in interface automation testing?
- IO进程线程->线程->day5
- 2022/08/02 学习笔记 (day22) 多线程
- How to prepare for the test interface test data
- 自组织是管理者和成员的双向奔赴
猜你喜欢

How many moments have you experienced the collapse of electronic engineers?

软件开发的最大的区别是什么?

Shell条件语句判断

接口管理工具YApi怎么用?颜值高、易管理、超好用

MCM box model modeling method and source analysis of atmospheric O3

如何利用 Flutter 实现炫酷的 3D 卡片和帅气的 360° 展示效果

I ported GuiLite to STM32F4 board

接口测试框架实战 | 流程封装与基于加密接口的测试用例设计

Super handy drawing tool is recommended

OpenFOAM提取等职面并计算面积
随机推荐
GIS数据漫谈(六)— 投影坐标系统
私域流量引流方法?分享购火爆的商业模式,你值得拥有
好消息!北京、珠海PMP考试时间来啦
OpenFOAM extracts equivalency and calculates area
接口测试框架实战(四)| 搞定 Schema 断言
JS bottom handwriting
Online password generator tool recommendation
Redis连接不上的报错解决方案汇总
Fluorescent marker peptides FITC/AMC/FAM/Rhodamine TAMRA/Cy3 / Cy5 / Cy7 - Peptide
2022/08/02 学习笔记 (day22) 多线程
【Harmony OS】【ArkUI】ets开发 图形与动画绘制
DFS's complement to pruning
超好用的画图工具推荐
链动2+1模式简单,奖励结构丰厚,自主裂变?
How to prepare for the test interface test data
RequestContextHolder
redis键值出现 xacxedx00x05tx00&的解决方法
表的创建、修改与删除
Kotlin-Flow common encapsulation class: the use of StateFlow
StarRocks 7 月社区动态