当前位置:网站首页>作业8.2 线程同步互斥机制——互斥锁
作业8.2 线程同步互斥机制——互斥锁
2022-08-03 00:05:00 【不知名大学生M】
文章目录
题目一:定义一个全局变量,char str[] = “123456”,要求定义两个线程:线程A, 线程B
1.要求A线程循环打印全局字符串str;
2.要求B线程循环倒置全局字符串str:将str中的内容倒置为"654321",再倒置为"123456"…
注意:是倒置不是倒着打印
4.要求A线程打印出的str字符串内容为:123456或者654321。
不允许出现乱序,例如:623451 653451,,,
实现代码
#include <stdio.h>
#include <pthread.h>
#include <string.h>
//临界资源(共享资源)
char str[] = "1234567";
pthread_mutex_t mutex; //互斥锁
void* callBack_print(void* arg)
{
while(1)
{
/***临界区*****/
pthread_mutex_lock(&mutex); //上锁
printf("%s\n", str);
pthread_mutex_unlock(&mutex); //解锁
/***临界区*****/
}
pthread_exit(NULL);
}
void* callBack_reserve(void* arg)
{
int i = 0;
while(1)
{
/***临界区*****/
pthread_mutex_lock(&mutex); //上锁
for(i=0; i<strlen(str)/2; i++)
{
char temp = str[i];
str[i] = str[strlen(str)-1-i];
str[strlen(str)-1-i] = temp;
}
pthread_mutex_unlock(&mutex); //解锁
/***临界区*****/
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//创建互斥锁,并初始化
if(pthread_mutex_init(&mutex, NULL) != 0)
{
perror("pthread_mutex_init");
return -1;
}
printf("mutex_init success\n");
pthread_t tid1, tid2;
//创建一个线程,循环打印
if(pthread_create(&tid1, NULL, callBack_print, NULL) != 0)
{
perror("pthread_create");
return -1;
}
//创建一个线程,循环倒置
if(pthread_create(&tid2, NULL, callBack_reserve, NULL) != 0)
{
perror("pthread_create");
return -1;
}
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
//销毁互斥锁
pthread_mutex_destroy(&mutex);
return 0;
}
运行结果
题目二:要求用两个线程拷贝一张图片,A线程拷贝前半部分,B线程拷贝后半部分
不允许使用sleep函数,不允许使用flag
实现代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define MSG_ERR(msg) do{
\ fprintf(stderr,"line: %d ", __LINE__); \ perror(msg);\ }while(0)
off_t size;
pthread_mutex_t mutex; //互斥锁
void* callBack_A(void* arg)
{
int* fd=(int*)arg;
char* buf1=(char*)malloc(size/2);
/***临界区*****/
pthread_mutex_lock(&mutex); //上锁
while(read(fd[0],buf1,size/2)>0)
{
write(fd[1],buf1,size/2);
}
pthread_mutex_unlock(&mutex); //解锁
/***临界区*****/
free(buf1);
buf1=NULL;
pthread_exit(NULL);
}
void* callBack_B(void* arg)
{
int* fd=(int*)arg;
char* buf2=(char*)malloc(size/2+1);
ssize_t c;
/***临界区*****/
pthread_mutex_lock(&mutex); //上锁
while((c=read(fd[0],buf2,size/2+1))>0)
{
write(fd[1],buf2,c);
}
pthread_mutex_unlock(&mutex); //解锁
/***临界区*****/
free(buf2);
buf2=NULL;
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
int fd1=open("/home/ubuntu/图片/sllh.jpg",O_RDONLY);
if(fd1<0)
{
MSG_ERR("open");
return -1;
}
int fd2=open("./sllh.jpg",O_WRONLY|O_CREAT|O_TRUNC,0777);
if(fd2<0)
{
MSG_ERR("open");
return -1;
}
int fd[2];
fd[0]=fd1;
fd[1]=fd2;
size=lseek(fd1,0,SEEK_END);
lseek(fd1,0,SEEK_SET);
//创建互斥锁,并初始化
if(pthread_mutex_init(&mutex, NULL) != 0)
{
perror("pthread_mutex_init");
return -1;
}
printf("mutex_init success\n");
pthread_t tid1, tid2;
//创建一个线程A,拷贝前半部分
if(pthread_create(&tid1, NULL, callBack_A,(void*)fd)!= 0)
{
perror("pthread_create");
return -1;
}
//创建一个线程B,拷贝后半部分
if(pthread_create(&tid2, NULL, callBack_B,(void*)fd)!= 0)
{
perror("pthread_create");
return -1;
}
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
//销毁互斥锁
pthread_mutex_destroy(&mutex);
return 0;
}
运行结果
将/home/ubuntu/图片/sllh.jpg拷贝到当前目录
边栏推荐
- 电压传感器: 工作原理、类型及电路图
- 从一文中了解SSRF的各种绕过姿势及攻击思路
- 2149. 按符号重排数组
- Last Common Ancestor (LCA) Study Notes | P3379 【Template】Least Common Ancestor (LCA) Problem Solution
- random.nextint()详解
- Auto.js special positioning control method cannot perform blocking operations on the ui thread, please use setTimeout instead
- 流程控制for和while循环语句
- 牛客网剑指offer刷题练习之链表中环的入口结点
- Jmeter二次开发实现rsa加密
- Auto.js 特殊定位控件方法 不能在ui线程执行阻塞操作,请使用setTimeout代替
猜你喜欢
随机推荐
为了面试阿里,熬夜肝完这份软件测试笔记后,Offer终于到手了
2022 Shandong International Youth Eye Health Industry Exhibition, Vision Health Exhibition, Optometry Exhibition
Speech Synthesis Model Cheat Sheet (1)
Auto.js special positioning control method cannot perform blocking operations on the ui thread, please use setTimeout instead
心电记录电路设计(框图/波形以及信号放大器的选择)
文树勋率长沙市人大常委会主任会议成员莅临麒麟信安调研数字经济发展情况
从一文中了解SSRF的各种绕过姿势及攻击思路
【Autosar RTM】
软件测试从业多年,自认为技术不错,裸辞:一晃 ,失业3个月了~
D with json
Last Common Ancestor (LCA) Study Notes | P3379 【Template】Least Common Ancestor (LCA) Problem Solution
可编程逻辑控制器(PLC) : 基础、类型和应用
【QT】自定义工程封装成DLL并如何调用(带ui界面的)
letcode 第20题-有效的括号
Wireshark数据抓包分析之传输层协议(TCP协议)
js基础知识整理之 —— Math
Moco of Mock tools use tutorial
dataBinding的import导入
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
DB2数据库-获取表结构异常:[jcc][t4][1065][12306][4.26.14]CharConvertionException ERRORCODE=-4220,SQLSTATE=null