线程信号量 Linux环境 C语言实现
既可以解决多个同类共享资源的互斥问题,也可以解决简易的同步问题
头文件:#include <semaphore.h>
类型:sem_t
初始化:int sem_init(sem_t *sem, int pshared, unsigned int value); //程序中第一次对指定信号量调用p、v操作前必须做初始化
清理:int sem_destroy(sem_t *sem);//程序中不再指定信号量时,应及时调用
P操作: int sem_wait(sem_t *sem);
V操作: int sem_post(sem_t *sem);功能:见函数名
返回值:成功为0,失败<0
注:pshared参数填零,本来是期望可以实现进程间使用的,Linux未实现
问题:线程1输出多个字符'a',线程2输出多个字符'b',要求打印的结果为abababab...
代码:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>sem_t sem1,sem2; // 初始化信号量void* pthread1(void *argv){for(int i = 0;i<10;i++){sem_wait(&sem1); // 如果信号量是1 就执行下面的代码(然后将sem1 置0),如果是0 就等待printf("a");fflush(stdout); // 冲刷缓冲区sem_post(&sem2); // 发送信号(将sem2 置1)}}
void* pthread2(void *argv){for(int i = 0;i<10;i++){sem_wait(&sem2);printf("b");fflush(stdout); // 冲刷缓冲区sem_post(&sem1); // 发送信号(将sem1 置1)}
}
int main(){pthread_t pth1,pth2;sem_init(&sem1,0,1); // 初始化信号量sem_init(&sem2,0,0);pthread_create(&pth1,NULL,pthread1,NULL);pthread_create(&pth2,NULL,pthread2,NULL);pthread_join(pth1,NULL);pthread_join(pth2,NULL);sem_destroy(&sem1);sem_destroy(&sem2);return 0;
}
输出:
问题:建三个线程,线程的ID分别是A,B,C,每个线程在屏幕输出自己的的ID 10 次,并且要求输出的顺序是:ABCABCABC.....(迅雷笔试题)
代码:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>sem_t sem1,sem2,sem3;void* print_a(void* argv){for(int i = 0;i<10;i++){sem_wait(&sem1);printf("A");fflush(stdout);sem_post(&sem2);}return NULL;
}void* print_b(void* argv){for(int i = 0;i<10;i++){sem_wait(&sem2);printf("B");fflush(stdout);sem_post(&sem3);}return NULL;
}void* print_c(void* argv){for(int i = 0;i<10;i++){sem_wait(&sem3);printf("C");fflush(stdout);sem_post(&sem1);}return NULL;
}int main(){pthread_t ph1,ph2,ph3;sem_init(&sem1,0,1);sem_init(&sem2,0,0);sem_init(&sem3,0,0);pthread_create(&ph1,NULL,print_a,NULL);pthread_create(&ph2,NULL,print_b,NULL);pthread_create(&ph3,NULL,print_c,NULL);pthread_join(ph1,NULL);pthread_join(ph2,NULL);pthread_join(ph3,NULL);sem_destroy(&sem1);sem_destroy(&sem2);sem_destroy(&sem3);return 0;
}
输出:
相关文章:
线程信号量 Linux环境 C语言实现
既可以解决多个同类共享资源的互斥问题,也可以解决简易的同步问题 头文件:#include <semaphore.h> 类型:sem_t 初始化:int sem_init(sem_t *sem, int pshared, unsigned int value); //程序中第一次对指定信号量调用p、v操…...
Tree搜索二叉树、map和set_数据结构
数据结构专栏 如烟花般绚烂却又稍纵即逝的个人主页 本章讲述数据结构中搜索二叉树与HashMap的学习,感谢大家的支持!欢迎大家踊跃评论,感谢大佬们的支持! 目录 搜索二叉树的概念二叉树搜索模拟实现搜索二叉树查找搜索二叉树插入搜索二叉树删除…...
Linux-GPIO应用编程
本章介绍应用层如何控制 GPIO,譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设,都有可能用得到这些操作方法。 照理说,GPIO的操作应该是由驱动层去做的,使用寄存器操作或者GPIO子系统之类的框架。 但是࿰…...
【模板】排序(py)/ 【深基9.例4】求第 k 小的数
题目描述 将读入的 NN 个数从小到大排序后输出。 输入格式 第一行为一个正整数 NN。 第二行包含 NN 个空格隔开的正整数 aiai,为你需要进行排序的数。 输出格式 将给定的 NN 个数从小到大输出,数之间空格隔开,行末换行且无空格。 输…...
Linux获取文件属性
目录 stat函数 获取文件属性 获取文件权限 实现“head -n 文件名”命令的功能 编程实现“ls -l 文件名”功能 stat/fstat/lstat的区别? stat函数 int stat(const char *path, struct stat *buf); 功能:获取文件属性 参数: path&…...
一文说清:Git创建仓库的方法
0 引言 本文介绍如何创建一个 Git 本地仓库,以及与远程仓库的关联。 1 初始化仓库(git init) 1.1 概述 Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使…...
ASP.NET Core 负载/压力测试
文章目录 一、第三方工具二、使用发布版本进行负载测试和压力测试 负载测试和压力测试对于确保 web 应用的性能和可缩放性非常重要。 尽管负载测试和压力测试的某些测试相似,但它们的目标不同。 负载测试:测试应用是否可以在特定情况下处理指定的用户负…...
红日靶场vulnstack (五)
前言 好久没打靶机了,今天有空搞了个玩一下,红日5比前面的都简单。 靶机环境 win7:192.168.80.150(外)、192.168.138.136(内) winserver28(DC):192.168.138.138 环境搭建就不说了,和之前写…...
k8s,声明式API对象理解
命令式API 比如: 先kubectl create,再replace的操作,我们称为命令式配置文件操作 kubectl replace的执行过程,是使用新的YAML文件中的API对象,替换原有的API对象;而kubectl apply,则是执行了一…...
【人工智能】用Python和Scikit-learn构建集成学习模型:提升分类性能
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 集成学习(Ensemble Learning)是通过组合多个弱学习器提升模型性能的机器学习方法,广泛应用于分类、回归及其他复杂任务中。随机森林(Random Forest)和梯度提升(Gradient Boosting)是集成学习的两种…...
MSBUILD : error MSB1009: 项目文件不存在。
环境:win10 vscode1.95.3 clang15.0.4 问题:最近用vscodecmakeclang在windows上编译c项目,用mingw32不报错,用clang报错,错误如下, MSBUILD : error MSB1009: 项目文件不存在。 原因:与其他生成器(如Mak…...
洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)
题目链接:P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度:普及 首先介绍下二叉树的遍历: 学过数据结构都知道二叉树有三种遍历: 1.前序遍历:根左右 2.中序遍历:左根…...
YOLOv8模型pytorch格式转为onnx格式
一、YOLOv8的Pytorch网络结构 model DetectionModel((model): Sequential((0): Conv((conv): Conv2d(3, 64, kernel_size(3, 3), stride(2, 2), padding(1, 1))(act): SiLU(inplaceTrue))(1): Conv((conv): Conv2d(64, 128, kernel_size(3, 3), stride(2, 2), padding(1, 1))(a…...
工业—使用Flink处理Kafka中的数据_ProduceRecord1
1 、 使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据,统计在已经检验的产品中,各设备每 5 分钟 生产产品总数,将结果存入Redis 中, key 值为 “totalproduce” , value 值为 “ 设备 id ,最近五分钟生…...
RNACOS:用Rust实现的Nacos服务
RNACOS是一个使用Rust语言开发的Nacos服务实现,它继承了Nacos的所有核心功能,并在此基础上进行了优化和改进。作为一个轻量级、快速、稳定且高性能的服务,RNACOS不仅包含了注册中心、配置中心和Web管理控制台的功能,还支持单机和集…...
响应式编程一、Reactor核心
目录 一、前置知识1、Lambda表达式2、函数式接口 Function3、StreamAPI4、Reactive-Stream1)几个实际的问题2)Reactive-Stream是什么?3)核心接口4)处理器 Processor5)总结 二、Reactor核心1、Reactor1&…...
聚簇索引与非聚簇索引
目录 一、聚簇索引(Clustered Index) 二、非聚簇索引(Non-Clustered Index) 三、示例说明 一、聚簇索引(Clustered Index) 定义: 聚簇索引是一种将数据存储和索引合为一体的索引方式。 表中…...
鸿蒙 Next 可兼容运行 Android App,还支持出海 GMS?
最近 「出境易」和 「卓易通」 应该算是鸿蒙和 Android 开发圈“突如其来”的热门话题,而 「出境易」可能更高频一些,主要也是 Next 5.0 被大家发现刚上架了一个名为「出境易」的应用,通过这个 App 用户可以直接运行不兼容 Next 的 Android A…...
opencv常用图像处理操作
OpenCV 处理图像的通用流程通常包括以下几个步骤,根据具体需求可以调整或跳过某些步骤。以下是一个通用的框架: 读取图像 加载图像文件到内存中以进行后续处理。 import cv2 读取图像 image cv2.imread(‘image.jpg’) # 彩色图像 gray_image cv2…...
<三>51单片机PWM开发SG90和超声测距
目录 1,PWM开发SG90 1.1简介 1.2控制舵机 1.3编程实现 2,超声测距 2.1简介 2.2,超声波测距代码实现 1,PWM开发SG90 1.1简介 PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进 行调制,等…...
如何加强游戏安全,防止定制外挂影响游戏公平性
在现如今的游戏环境中,外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂(Customized Cheats),它不仅复杂且隐蔽,更能针对性地绕过传统的反作弊系统,对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…...
《矿物学报》
1 简介 《矿物学报》由中国科学院地球化学研究所和中国矿物岩石地球化学学会联合主办,1981年创刊,目前是双月刊,国内外公开发行。主要报道矿物学及相关学科的高水平研究成果,矿物学研究的现状综述和动态分析,以及国内…...
如何将快捷指令添加到启动台
如何将快捷指令添加到启动台/Finder/访达(Mac) 1. 打开快捷指令创建快捷指令 示例创建了一个文件操作测试的快捷指令。 2. 右键选择添加到程序坞 鼠标放在待添加的快捷指令上。 3. 右键添加到访达 鼠标放在待添加的快捷指令上。 之后就可以在启…...
Python NumPy学习指南:从入门到精通
Python NumPy学习指南:从入门到精通 第一部分:NumPy简介与安装 1. 什么是NumPy? NumPy,即Numerical Python,是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray,并支持大量的数学函…...
rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)
1.插件版本 插件地址:Community Plugins | RabbitMQ rabbitmq插件需要对应的版本,根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是: 所以我选择插件版本是: 下载 .ez文…...
【C++】new与malloc、三种传参、函数重载及内联函数
一、new-delete以及malloc-freequbie 1.new: (1)运算符,没有返回值概念,但开出来空间有类型,不需要设置大小 (2)可以在堆区动态开辟空间,并且可以默认执…...
C语言实例_23之计算阶乘和(5!+4!+…+1!)
1. 题目 计算阶乘和(5! 4! … 1!),即先分别计算出从1到5每个数的阶乘,再将这些阶乘值进行累加求和。 2. 阶乘概念及分析 实现主要是迭代和递归: - 迭代实现思路: - 可以通过两层循环来实现,外层循环控制数字从5到…...
zotero中pdf-translate插件和其他插件的安装
1.工具–》插件 2.找插件 3.点击之后看到一堆插件 4.找到需要的,例如pdf-translate 5.点击进入,需要看一下md文档了解下,其实最重要的就是找到特有的(.xpi file) 6.点击刚刚的蓝色链接 7.下载并保存xpi文件 8.回到zotero,安装并使…...
【Linux系统编程】——理解冯诺依曼体系结构
文章目录 冯诺依曼体系结构硬件当代计算机是性价比的产物冯诺依曼的存储冯诺依曼的数据流动步骤冯诺依曼结构总结 冯诺依曼体系结构硬件 下面是整个冯诺依曼体系结构 冯诺依曼结构(Von Neumann Architecture)是现代计算机的基本结构之一,由数…...
C++中实现多态有几种方式
一)虚函数(Virtual Functions)实现多态 概念: 虚函数是在基类中使用关键字virtual声明的成员函数。当一个类包含虚函数时,编译器会为该类创建一个虚函数表(v - table),这个表存储了虚…...
WPF+MVVM案例实战与特效(三十四)- 日志管理:使用 log4net 实现高效日志记录
文章目录 1、概述2、日志案例实现1、LogHelper 类详解2、代码解释3、配置文件4、实际应用案例场景 1:记录系统运行日志场景 2:记录数据库操作日志场景 3:记录 HTTP 请求日志5、总结1、概述 在WPF软件开发中,良好的日志记录机制对于系统的调试、维护和性能优化至关重要。lo…...
AI与低代码技术融合:如何加速企业智能化应用开发?
引言 随着全球数字化转型的步伐加快,企业在智能化应用开发方面面临着前所未有的挑战和机遇。传统的软件开发方式往往需要大量的技术人员、时间和资源,而在瞬息万变的市场环境中,这种模式显得效率低下且难以满足企业快速迭代和创新的需求。 与…...
git常用操作
通过分支src_br开发合并代码 在remote网页端从master分支创建一个src_br(master为合并代码的target分支)本地git仓库更新代码 git pull 切换到src_br分支 git checkout src_br 同步master分支的代码 git rebase master or git merge master or git cherry-pick commit-id…...
DVWA 靶场 SQL 注入报错 Illegal mix of collations for operation ‘UNION‘ 的解决方案
在 dvwa 靶场进行联合 SQL 注入时,遇到报错 Illegal mix of collations for operation UNION报错如下图: 解决办法: 找到文件MySQL.php 大致位置在dvwaincludesDBMS 目录下 使用编辑器打开 检索$create_db 第一个就是 在{$_DVWA[ ‘db_d…...
单片机的基本构成与工作原理
单片机,即微控制器(Microcontroller Unit,MCU),是一种将中央处理器(CPU)、存储器(ROM/RAM)、定时/计数器(Timer/Counter)、中断系统、输入输出(I/O)接口等集成在一块芯片上的微型计算机。它具有体积小、功耗低、成本低…...
qt QSettings详解
1、概述 QSettings是Qt框架中用于应用程序配置和持久化数据的一个类。它提供了一种便捷的方式来存储和读取应用程序的设置,如窗口大小、位置、用户偏好等。QSettings支持多种存储格式,包括INI文件、Windows注册表(仅限Windows平台࿰…...
微信小程序全屏显示地图
微信小程序在界面上显示地图,只需要用map标签 <map longitude"经度度数" latitude"纬度度数"></map>例如北京的经纬度为:116.407004,39.904595 <map class"bgMap" longitude"116.407004" lati…...
【Linux课程学习】:文件第二弹---理解一切皆文件,缓存区
🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux学习笔记: https://blog.csdn.net/d…...
浅谈CI持续集成
1.什么是持续集成 持续集成(Continuous Integration)(CI)是一种软件开发实践,团队成员频繁地将他们的工作成果集成到一起(通常每人每天至少提交一次,这样每天就会有多次集成),并且在每次提交后…...
微信创建小程序码 - 数量不受限制
获取小程序码:小程序码为圆图,且不受数量限制。 目录 文档 接口地址 请求方式 功能描述 注意事项 获取 scene 值 请求参数 返回参数 对接 请求方法 获取小程序码 调用获取小程序码 总结 文档 接口地址 https://api.weixin.qq.com/wxa/get…...
基于 Elasticsearch Completion Suggester 实现高效搜索智能提示
1. 引言 在现代搜索引擎中,搜索智能提示已成为提升用户体验的重要功能之一。无论是电商网站、内容管理平台,还是社交媒体应用,智能提示都能帮助用户快速输入关键字、发现相关内容,并减少拼写错误带来的困扰。 1.1 什么是搜索智能…...
框架建设实战1——创建frame-parent
结合框架的结构,首先我们创建所以使用框架的parent,用以自顶向下的框架组件管理。 本框架基于maven进行依赖管理。具体步骤如下: 1.创建一个module 创建一个maven工程。命名为frame-parent。只有一个pom文件。文件内容主要包含:…...
Qt 安装Qt Serial Port
最近要用Qt写个串口上位机软件,发现Qt的串口库用不了,上网找了一下资料,找到一种解决办法,具体操作如下: 参考文章:https 目录 一、找到QT安装路径,并运行Qt Maintenance Tool二、选择 添加或移…...
GPS模块/SATES-ST91Z8LR:电路搭建;直接用电脑的USB转串口进行通讯;模组上报定位数据转换地图识别的坐标手动查询地图位置
从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...
Vue Web开发(一)
1. 环境配置 1.1. 开发工具下载 1.1.1. HbuilderX 官网地址:https://uniapp.dcloud.net.cn/ 1.1.2. Visual Studio Code 官网地址:https://code.visualstudio.com/Download 1.1.3. Node环境 官网地址:https://nodejs.cn/ 正常软件安装…...
帮我写一篇关于AI搜索网页上编写的文章是否存在版权问题的文章, 字数在 3000 字左右。文心一言提问, 记录后用.
AI搜索网页上编写的文章是否存在版权问题? 在当今科技飞速发展的时代,AI搜索工具如雨后春笋般涌现,为人们获取信息提供了极大的便利。然而,随之而来的问题是,AI搜索案例中常常出现很多内容缺乏依据,这引发…...
物联网智能项目如何实现设备高效互联与数据处理?
一、硬件(Hardware) 设备互联的基础,涵盖传感器、执行器、网关和边缘计算设备。 传感器与执行器 功能: 采集环境数据(如温度、湿度、运动等)并执行控制命令。优化方向: 低功耗、高精度传感器以…...
《地球化学》
《地球化学》主要报道近代地球化学, 特别是其主要分支学科, 如岩石地球化学、元素地球化学、有机地球化学、环境地球化学、矿床地球化学、实验地球化学、生物地球化学、天体化学、计算地球化学、分析地球化学、海洋地球化学、沉积地球化学、纳米地球化学、油气地球化学和同位素…...
UE5 C++ 不规则按钮识别,复选框不规则识别 UPIrregularWidgets
插件名称:UPIrregularWidgets 插件包含以下功能 你可以点击任何图片,而不仅限于矩形图片。 UPButton、UPCheckbox 基于原始的 Button、Checkbox 扩展。 复选框增加了不规则图像识别功能,复选框增加了悬停事件。 欢迎来到我的博客 记录学习过…...
南京邮电大学《2024年812自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《南京邮电大学812自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...