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

边栏推荐
猜你喜欢
随机推荐
表的创建、修改与删除
【Harmony OS】【FAQ】鸿蒙问题合集1
Practical application of WebSocket
GIS数据漫谈(五)— 地理坐标系统
13.机器学习基础:数据预处理与特征工程
接口测试框架实战 | 流程封装与基于加密接口的测试用例设计
【Harmony OS】【ARK UI】轻量级数据存储
shell脚本循环语句
三丁基-巯基膦烷「tBuBrettPhos Pd(allyl)」OTf),1798782-17-8
记录一些遇见的bug——mapstruct和lombok同时使用时,转换实体类时数据丢失问题
Concepts and Methods of Exploratory Testing
rosbag工具plotjuggler无法打开rosbag的问题
How to use the interface management tool YApi?Beautiful, easy to manage, super easy to use
Harmony OS Date ano UI 】 【 】 the basic operation
typescript47-函数之间的类型兼容性
CobalStrike(CS)基础超级详细版
The flink sql task is changed, and after adding several fields to the sql, an error occurs when restoring from the previously saved savepoint.
测试人员的价值体现在哪里
接口测试如何准备测试数据
shell script loop statement









