当前位置:网站首页>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 执行结果

边栏推荐
- 链动2+1模式简单,奖励结构丰厚,自主裂变?
- Interface testing framework of actual combat (2) | interface request assertion
- Two ways to simulate multi-user login in Jmeter
- js的垃圾回收机制
- Technology Sharing | How to do assertion verification for xml format in interface automation testing?
- 2.何为张量
- typescript49-交叉类型
- [Harmony OS] [ArkUI] ets development graphics and animation drawing
- How to prepare for the test interface test data
- 深圳线下报名|StarRocks on AWS:如何对实时数仓进行极速统一分析
猜你喜欢

I ported GuiLite to STM32F4 board

Online password generator tool recommendation

刚上线就狂吸70W粉,新型商业模式“分享购”来了,你知道吗?

社交电商:流量红利已尽,裂变营销是最低成本的获客之道

【Harmony OS】【ARK UI】Date 基本操作

2022/08/02 学习笔记 (day22) 多线程

Windows 安装PostgreSQL

RequestContextHolder

Live | StarRocks technology insider: low base dictionary global optimization

How to prepare for the test interface test data
随机推荐
9.新闻分类:多分类问题
11.机器学习基础:机器学习的四个分支
Kotlin-Flow common encapsulation class: the use of StateFlow
redis键值出现 xacxedx00x05tx00&的解决方法
软件开发的最大的区别是什么?
typescript47-函数之间的类型兼容性
Jmeter 模拟多用户登录的两种方法
Where is the value of testers
我将GuiLite移植到了STM32F4开发板上
刚上线就狂吸70W粉,新型商业模式“分享购”来了,你知道吗?
【HMS core】【Ads Kit】Huawei Advertising——Overseas applications are tested in China. Official advertisements cannot be displayed
install ambari
CobalStrike(CS)基础超级详细版
数据库基本概述与SQL概述
js garbage collection mechanism
【Harmony OS】【ARK UI】ets使用startAbility或startAbilityForResult方式调起Ability
记录一些遇见的bug——mapstruct和lombok同时使用时,转换实体类时数据丢失问题
User password encryption tool
Fluorescent marker peptides FITC/AMC/FAM/Rhodamine TAMRA/Cy3 / Cy5 / Cy7 - Peptide
WinForm的控件二次开发