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

7.19作业

第一题:测试错误检查锁和递归锁是否能避免死锁。

错误检查锁避免死锁:

如果一个线程尝试获取它自己已经持有的锁,pthread_mutex_lock 将不会阻塞,而是返回错误 EDEADLK

#include <pthread.h>
#include <stdio.h>
#include <errno.h>pthread_mutex_t error_check_lock = PTHREAD_MUTEX_INITIALIZER;void *try_locking_thread(void *arg) {int ret;ret = pthread_mutex_lock(&error_check_lock);if (ret == 0) {printf("Lock acquired\n");pthread_mutex_unlock(&error_check_lock);} else if (ret == EDEADLK) {printf("Deadlock detected, error: %d\n", ret);} else {printf("Other error: %d\n", ret);}return NULL;
}int main() {pthread_t thread1, thread2;pthread_mutex_lock(&error_check_lock);  //锁定已被持有pthread_create(&thread1, NULL, try_locking_thread, NULL);pthread_create(&thread2, NULL, try_locking_thread, NULL);pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_mutex_unlock(&error_check_lock);return 0;
}

递归锁避免死锁:

递归锁允许线程多次获取同一把锁,从而避免了因重复加锁而导致的死锁。

#include <pthread.h>
#include <stdio.h>pthread_mutex_t recursive_lock = PTHREAD_MUTEX_INITIALIZER;void *recursive_locking_thread(void *arg) {int i;for (i = 0; i < 10; i++) {pthread_mutex_lock(&recursive_lock);printf("Lock acquired %d\n", i);pthread_mutex_unlock(&recursive_lock);}return NULL;
}int main() {pthread_t thread1, thread2;pthread_mutexattr_t attr;pthread_mutexattr_init(&attr);pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);pthread_mutex_init(&recursive_lock, &attr);pthread_create(&thread1, NULL, recursive_locking_thread, NULL);pthread_create(&thread2, NULL, recursive_locking_thread, NULL);pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_mutex_destroy(&recursive_lock);pthread_mutexattr_destroy(&attr);return 0;
}

第二题:模拟火车过隧道场景,考虑不同类型列车的隧道选择。

第三题:编写两个线程的同步代码,具体场景未给出,需根据实际情况设计。

假设我们有一个场景,其中两个线程需要访问同一资源,但资源一次只能被一个线程访问。我们可以使用互斥锁来实现同步,确保资源的正确访问:

#include <pthread.h>
#include <stdio.h>pthread_mutex_t resource_lock = PTHREAD_MUTEX_INITIALIZER;
int resource_value = 0;void *thread_function(void *arg) {int thread_id = *(int*)arg;int i;for (i = 0; i < 10; i++) {pthread_mutex_lock(&resource_lock);resource_value++;printf("Thread %d increased resource value to %d\n", thread_id, resource_value);pthread_mutex_unlock(&resource_lock);}return NULL;
}int main() {pthread_t threads[2];int thread_ids[2] = {1, 2};pthread_create(&threads, NULL, thread_function, (void*)&thread_ids);pthread_create(&threads[1], NULL, thread_function, (void*)&thread_ids[1]);pthread_join(threads, NULL);pthread_join(threads[1], NULL);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【网络】socket套接字基础知识
  • 【学习笔记】无人机系统(UAS)的连接、识别和跟踪(十)-无人机A2X服务
  • HTML2048小游戏
  • 【Apache Doris】周FAQ集锦:第 16 期
  • 【js自学打卡11】生成器函数(generator函数)的使用总结+代码举例
  • 力扣题解(盈利计划)
  • C++多继承与虚继承
  • Artix7系列FPGA实现SDI视频编解码+UDP以太网传输,基于GTP高速接口,提供工程源码和技术支持
  • Unity UGUI 之 Canvas画布
  • 深入理解TCP/IP协议中的三次握手
  • GD32 MCU是如何进入中断函数的
  • Android 10.0 蓝牙音乐获取歌手、歌曲等信息功能实现
  • 微服务重启优化kafka+EurekaNotificationServerListUpdater
  • 【Docker】Docker-compose 单机容器集群编排工具
  • Armpro搭建教程全开源版的教程
  • 网络传输文件的问题
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • iOS编译提示和导航提示
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • MobX
  • PHP变量
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • uva 10370 Above Average
  • Vue 重置组件到初始状态
  • WebSocket使用
  • 动态规划入门(以爬楼梯为例)
  • 浮现式设计
  • 构建工具 - 收藏集 - 掘金
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于Android乐音识别(2)
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 记录:CentOS7.2配置LNMP环境记录
  • 前嗅ForeSpider采集配置界面介绍
  • 详解移动APP与web APP的区别
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 怎样选择前端框架
  • 主流的CSS水平和垂直居中技术大全
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ionic入门之数据绑定显示-1
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​马来语翻译中文去哪比较好?
  • #{}和${}的区别是什么 -- java面试
  • #565. 查找之大编号
  • #pragam once 和 #ifndef 预编译头
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #微信小程序(布局、渲染层基础知识)
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (CPU/GPU)粒子继承贴图颜色发射
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (十八)三元表达式和列表解析
  • (小白学Java)Java简介和基本配置