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

1.31 实现五个线程的同步

1.使用互斥锁实现

1>程序代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;//创建互斥锁
pthread_mutex_t m;
pthread_mutex_t m1;
pthread_mutex_t m2;
pthread_mutex_t m3;
pthread_mutex_t m4;void* thread_main1(void* arg)
{while(1){pthread_mutex_lock(&m1);printf("1#线程\n");sleep(1);pthread_mutex_unlock(&m2);}
}void* thread_main2(void* arg)
{while(1){pthread_mutex_lock(&m2);printf("2#线程\n");sleep(1);pthread_mutex_unlock(&m3);}
}void* thread_main3(void* arg)
{while(1){pthread_mutex_lock(&m3);printf("3#线程\n");sleep(1);pthread_mutex_unlock(&m4);}
}void* thread_main4(void* arg)
{while(1){pthread_mutex_lock(&m4);printf("4#线程\n");printf("-------------\n");sleep(1);pthread_mutex_unlock(&m);}
}int main(int argc, const char *argv[])
{//初始化互斥锁pthread_mutex_init(&m,NULL);pthread_mutex_init(&m1,NULL);pthread_mutex_init(&m2,NULL);pthread_mutex_init(&m3,NULL);pthread_mutex_init(&m4,NULL);pthread_mutex_lock(&m1);pthread_mutex_lock(&m2);pthread_mutex_lock(&m3);pthread_mutex_lock(&m4);//创建4个分支线程pthread_t id1;pthread_create(&id1,0,thread_main1,0);pthread_detach(id1);pthread_t id2;pthread_create(&id2,0,thread_main2,0);pthread_detach(id2);pthread_t id3;pthread_create(&id3,0,thread_main3,0);pthread_detach(id3);pthread_t id4;pthread_create(&id4,0,thread_main4,0);pthread_detach(id4);//主线程while(1){pthread_mutex_lock(&m);printf("主线程\n");sleep(1);pthread_mutex_unlock(&m1);}//销毁互斥锁pthread_mutex_destroy(&m);pthread_mutex_destroy(&m1);pthread_mutex_destroy(&m2);pthread_mutex_destroy(&m3);pthread_mutex_destroy(&m4);return 0;
}
2>运行效果

2.使用信号量实现

1>程序代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;//创建信号量
sem_t s;
sem_t s1;
sem_t s2;
sem_t s3;
sem_t s4;void* thread_main1(void* arg)
{while(1){sem_wait(&s1);printf("1#线程\n");sleep(1);sem_post(&s2);}
}void* thread_main2(void* arg)
{while(1){sem_wait(&s2);printf("2#线程\n");sleep(1);sem_post(&s3);}
}void* thread_main3(void* arg)
{while(1){sem_wait(&s3);printf("3#线程\n");sleep(1);sem_post(&s4);}
}void* thread_main4(void* arg)
{while(1){sem_wait(&s4);printf("4#线程\n");printf("----------------\n");sleep(1);sem_post(&s);}
}int main(int argc, const char *argv[])
{//初始化信号量sem_init(&s,0,1);sem_init(&s1,0,1);sem_init(&s2,0,1);sem_init(&s3,0,1);sem_init(&s4,0,1);sem_wait(&s1);sem_wait(&s2);sem_wait(&s3);sem_wait(&s4);//创建4个分支线程pthread_t id1;pthread_create(&id1,0,thread_main1,0);pthread_detach(id1);pthread_t id2;pthread_create(&id2,0,thread_main2,0);pthread_detach(id2);pthread_t id3;pthread_create(&id3,0,thread_main3,0);pthread_detach(id3);pthread_t id4;pthread_create(&id4,0,thread_main4,0);pthread_detach(id4);//销毁信号量sem_destroy(&s);sem_destroy(&s1);sem_destroy(&s2);sem_destroy(&s3);sem_destroy(&s4);//主线程while(1){sem_wait(&s);printf("主线程\n");sleep(1);sem_post(&s1);}return 0;
}
2>运行效果

相关文章:

1.31 实现五个线程的同步

1.使用互斥锁实现 1>程序代码 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include &l…...

three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)

春节忙完一轮&#xff0c;总算可以继续来写博客了。希望在春节假期结束之前能多更新几篇。 这一篇会偏理论多一点。笔者本没打算在这一系列里面重点讲理论&#xff0c;所以像相机矩阵推导这种网上已经很多优质文章的内容&#xff0c;笔者就一笔带过。 然而关于负缩放&#xf…...

【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)

本文项目编号 T 165 &#xff0c;文末自助获取源码 \color{red}{T165&#xff0c;文末自助获取源码} T165&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

《大数据时代“快刀”:Flink实时数据处理框架优势全解析》

在数字化浪潮中&#xff0c;数据呈爆发式增长&#xff0c;实时数据处理的重要性愈发凸显。从金融交易的实时风险监控&#xff0c;到电商平台的用户行为分析&#xff0c;各行业都急需能快速处理海量数据的工具。Flink作为一款开源的分布式流处理框架&#xff0c;在这一领域崭露头…...

antdesignvue统计数据源条数、计算某列合计值、小数计算不精确多了很多小数位

1.在</a-table>下方加如下代码 <div>数据总条数&#xff1a;{ {tableData.length}}&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp <template>A列合计&#xff1a;{ {sum}}</template> </div> 注&#xff1a;tableData为<a-tabl…...

02.05、链表求和

02.05、[中等] 链表求和 1、题目描述 给定两个用链表表示的整数&#xff0c;每个节点包含一个数位。 这些数位是反向存放的&#xff0c;也就是个位排在链表首部。 编写函数对这两个整数求和&#xff0c;并用链表形式返回结果。 2、解题思路 本题要求对两个链表表示的整数…...

dmfldr实战

dmfldr实战 本文使用达梦的快速装载工具&#xff0c;对测试表进行数据导入导出。 新建测试表 create table “BENCHMARK”.“TEST_FLDR” ( “uid” INTEGER identity(1, 1) not null , “name” VARCHAR(24), “begin_date” TIMESTAMP(0), “amount” DECIMAL(6, 2), prim…...

Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)

文章目录 Kafka 副本机制&#xff08;包含AR、ISR、OSR、HW 和 LEO 介绍&#xff09;1. 副本的基本概念2. 副本同步和一致性2.1 AR&#xff08;Assigned Replicas&#xff09;2.2 ISR&#xff08;In-Sync Replicas&#xff09;2.3 OSR&#xff08;Out-of-Sync Replicas&#xf…...

爬虫基础(二)Web网页的基本原理

一、网页的组成 网页由三部分构成&#xff1a;HTML、JavaScript、CSS。 &#xff08;1&#xff09;HTML HTML 相当于网页的骨架&#xff0c;它通过使用标签来定义网页内容的结构。 举个例子&#xff1a; 它把图片标签为img、把视频标签为video&#xff0c;然后组合到一个界面…...

外网访问禅道软件项目管理系统

禅道项目管理软件是一款国产的开源免费项目管理软件&#xff0c;专注于研发项目管理&#xff0c;旨在帮助企业或团队提高项目管理的效率和质量。 本文将详细的介绍如何在 Windows 系统电脑端下载运行禅道软件项目管理系统&#xff0c;并且结合路由侠内网穿透实现外网访问本地的…...

Python 梯度下降法(五):Adam Optimize

文章目录 Python 梯度下降法&#xff08;五&#xff09;&#xff1a;Adam Optimize一、数学原理1.1 介绍1.2 符号说明1.3 实现流程 二、代码实现2.1 函数代码2.2 总代码2.3 遇到的问题2.4 算法优化 三、优缺点3.1 优点3.2 缺点 四、相关链接 Python 梯度下降法&#xff08;五&a…...

笔试-二进制

应用题 将符合区间[l,r]内的十进制整数转换为二进制表示&#xff0c;请问不包含“101”的整数个数是多少&#xff1f; 实现 l int(input("请输入下限l&#xff0c;其值大于等于1&#xff1a;")) r int(input("请输入上限r&#xff0c;其值大于等于l&#x…...

springboot 2.7.6 security mysql redis jwt配置例子

数据库结构用的是若依的数据库基本结构,ruoyi.vip。 总体参考了文章&#xff1a;https://blog.csdn.net/qq_45847507/article/details/126681110 本文章只包含不同的地方&#xff0c;相同的不再赘述。 1、创建spring工程&#xff0c;jdk1.8&#xff0c;maven。 pom.xml中依赖部…...

FreeRTOS从入门到精通 第十六章(任务通知)

参考教程&#xff1a;【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、任务通知简介 1、概述 &#xff08;1&#xff09;任务通知顾名思义是用来通知任务的&#xff0c;任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 &#xff08;2&#…...

TensorFlow 简单的二分类神经网络的训练和应用流程

展示了一个简单的二分类神经网络的训练和应用流程。主要步骤包括&#xff1a; 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与部署 加载和应用已训练的模型 1. 数据准备与预处理 在本例中&#xff0c;数据准备是通过两个 Numpy 数…...

无人机图传模块 wfb-ng openipc-fpv,4G

openipc 的定位是为各种模块提供底层的驱动和linux最小系统&#xff0c;openipc 是采用buildroot系统编译而成&#xff0c;因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢&#xff1f;因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来&#xff0c;从而…...

.cc扩展名是什么语言?C语言必须用.c为扩展名吗?主流编程语言扩展名?Java为什么不能用全数字的文件名?

.cc扩展名是什么语言? .cc是C语言使用的扩展名&#xff0c;一种说法是它是c with class的简写&#xff0c;当然C语言使用的扩展名不止.cc和.cpp, 还包含.cxx, .c, .C等&#xff0c;这些在不同编译器系统采用的默认设定不同&#xff0c;需要区分使用。当然&#xff0c;编译器提…...

【MyDB】4-VersionManager 之 3-死锁及超时检测

【MyDB】4-VersionManager 之 3-死锁及超时检测 死锁及超时检测案例背景LockTable锁请求与等待管理 addvm调用addputIntoList&#xff0c;isInList&#xff0c;removeFromList 死锁检测 hasDeadLock方法资源释放与重分配 参考资料 死锁及超时检测 本章涉及代码&#xff1a;top/…...

【Linux】使用管道实现一个简易版本的进程池

文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程&#xff1a; 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…...

【OpenGL】OpenGL游戏案例(二)

文章目录 特殊效果数据结构生成逻辑更新逻辑 文本渲染类结构构造函数加载函数渲染函数 特殊效果 为提高游戏的趣味性&#xff0c;在游戏中提供了六种特殊效果。 数据结构 PowerUp 类只存储存活数据&#xff0c;实际逻辑在游戏代码中通过Type字段来区分执行 class PowerUp …...

3个场景解锁小爱音箱音乐自由:开源神器XiaoMusic的终极指南

3个场景解锁小爱音箱音乐自由&#xff1a;开源神器XiaoMusic的终极指南 【免费下载链接】xiaomusic 使用小爱音箱播放音乐&#xff0c;音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 还在为小爱音箱的音乐播放限制而烦恼吗&…...

Windows 11 LTSC系统恢复微软商店:3分钟快速安装完整指南

Windows 11 LTSC系统恢复微软商店&#xff1a;3分钟快速安装完整指南 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 你是否在使用Windows 11 LTSC版本…...

ESP32-S3开发实战:从点灯到Wi-Fi联网的完整指南

1. 项目概述&#xff1a;从点灯到联网的ESP32-S3实战之旅拿到一块新的开发板&#xff0c;第一件事是什么&#xff1f;我的习惯永远是先让它“眨眨眼”。这个看似简单的LED闪烁&#xff0c;在嵌入式开发里&#xff0c;就像程序员的“Hello World”&#xff0c;是检验硬件、软件环…...

别再踩坑了!Ubuntu 20.04下用Docker一键编译OLLVM 4.0(附完整Dockerfile)

基于Docker的OLLVM 4.0高效编译指南&#xff1a;Ubuntu 20.04最佳实践 在移动安全与逆向工程领域&#xff0c;OLLVM作为代码混淆的黄金标准工具链&#xff0c;其环境搭建一直是开发者面临的痛点。传统源码编译方式需要处理复杂的依赖关系、版本冲突和系统污染风险&#xff0c;而…...

PyVisionAI:基于视觉大模型的文档内容智能提取与理解工具

1. 项目概述&#xff1a;PyVisionAI&#xff0c;一个文档内容提取与视觉理解的瑞士军刀如果你经常需要从PDF、PPT、Word文档甚至网页中提取内容&#xff0c;并且希望AI能帮你“看懂”里面的图片和图表&#xff0c;那么PyVisionAI这个工具你应该了解一下。它本质上是一个Python工…...

如何高效获取金融数据:Python通达信接口的完整指南

如何高效获取金融数据&#xff1a;Python通达信接口的完整指南 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在金融数据分析和量化交易领域&#xff0c;获取准确、及时且成本可控的市场数据一直…...

Zotero PDF Translate:打破语言壁垒,让外文文献阅读更高效 [特殊字符]

Zotero PDF Translate&#xff1a;打破语言壁垒&#xff0c;让外文文献阅读更高效 &#x1f680; 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: ht…...

从AD9288到STM32H750:手把手拆解开源示波器osc_fun的硬件架构与选型思路

从AD9288到STM32H750&#xff1a;开源示波器osc_fun的硬件架构深度解析与工程实践 在开源硬件领域&#xff0c;osc_fun示波器项目以其精巧的架构设计和出色的性价比&#xff0c;成为众多硬件开发者研究的热点。这个看似简单的示波器背后&#xff0c;隐藏着一系列精妙的硬件选型…...

微信网页版访问难题如何破解?wechat-need-web浏览器扩展的轻量级替代方案探索

微信网页版访问难题如何破解&#xff1f;wechat-need-web浏览器扩展的轻量级替代方案探索 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 你是否曾在公…...

【限时决策窗口】ChatGPT Plus会员购买指南:避开3个高发误区,抓住GPT-4 Turbo+文件解析+自定义GPT三重红利期

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ChatGPT Plus会员值不值得买 ChatGPT Plus 提供每月 $20 的订阅服务&#xff0c;主打 GPT-4 模型访问、高优先级响应队列、文件上传解析&#xff08;PDF/CSV/TXT 等&#xff09;及自定义 GPTs 功能。是…...