2023-4-10-用Pthreads计算积分
🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟 😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆 💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖
🍬本文摘要

用Pthreads计算积分的一个小例子
说明:编写一个Pthreads程序使用梯形积分求出函数𝑓(𝑥)=𝑥
2+𝑥 在区间[𝑎,𝑏]的定积分。使
用一个共享变量来表示所有计算线程的总和。在程序中使用忙等待,互斥量和信号量三种来保
证临界区的互斥。命令行如下编译:
$./pth_trap <number of threads> <number of method>
目录
- 🍬本文摘要
- 😉一、代码展示
- 🐱🐉二、运行结果
😉一、代码展示
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>int thread_count, flag = 0;
long n, order, start_time, end_time, a, b;
double h, sum_waiting, sum_mutex, sum_semaphores;
pthread_mutex_t mutex;
sem_t semaphore;void *Thread_sum_waiting(void *rank);void *Thread_sum_mutex(void *rank);void *Thread_sum_semaphores(void *rank);int main() {long i;pthread_t *thread_handles;scanf("%d %d", &thread_count, &order);if (order == 1) {printf("Using method busy-wait\n");} else if (order == 2) {printf("Using method mutex\n");} else {printf("Using method signal\n");}thread_handles = (pthread_t *) malloc(thread_count * sizeof(pthread_t));printf("Input the value of a,b,n:\n");scanf("%d %d %d", &a, &b, &n);h = (b - a) * 1.0 / n;//求出来区间分为n份之后每一份的长度switch (order) {case 1:sum_waiting = 0;start_time = clock();for (i = 0; i < thread_count; i++)pthread_create(&thread_handles[i], NULL, Thread_sum_waiting, (void *) i);for (i = 0; i < thread_count; i++)pthread_join(thread_handles[i], NULL);end_time = clock();printf("Estimate of the integral:%lf\n", sum_waiting);//CLOCKS_PER_SEC);break;case 2:sum_mutex = 0;start_time = clock();pthread_mutex_init(&mutex, NULL);for (i = 0; i < thread_count; i++)pthread_create(&thread_handles[i], NULL, Thread_sum_mutex, (void *) i);for (i = 0; i < thread_count; i++)pthread_join(thread_handles[i], NULL);pthread_mutex_destroy(&mutex);end_time = clock();printf("Estimate of the integral:%lf\n", sum_mutex);//CLOCKS_PER_SEC);break;case 3:sum_semaphores = 0;start_time = clock();sem_init(&semaphore, 0, 1);for (i = 0; i < thread_count; i++)pthread_create(&thread_handles[i], NULL, Thread_sum_semaphores, (void *) i);for (i = 0; i < thread_count; i++)pthread_join(thread_handles[i], NULL);sem_destroy(&semaphore);end_time = clock();printf("Estimate of the integral:%lf\n", sum_semaphores);//CLOCKS_PER_SEC);break;}}void *Thread_sum_waiting(void *rank) {long my_rank = (uintptr_t) rank;long long i;double a, b;long long my_n = n / thread_count;long long my_first_i = my_n * my_rank;long long my_last_i = my_first_i + my_n;for (i = my_first_i; i < my_last_i; i++) {a = (i * h) * (i * h) + (i * h);//x2+xb = ((i + 1) * h) * ((i + 1) * h) + ((i + 1) * h);//x2+xwhile (flag != my_rank);sum_waiting += (a + b) * h / 2;flag = (flag + 1) % thread_count;}
}void *Thread_sum_mutex(void *rank) {long my_rank = (uintptr_t) rank;long long i;double a, b;long long my_n = n / thread_count;long long my_first_i = my_n * my_rank;long long my_last_i = my_first_i + my_n;for (i = my_first_i; i < my_last_i; i++) {a = (i * h) * (i * h) + (i * h);//x2+xb = ((i + 1) * h) * ((i + 1) * h) + ((i + 1) * h);//x2+xpthread_mutex_lock(&mutex);sum_mutex += (a + b) * h / 2;pthread_mutex_unlock(&mutex);}
}void *Thread_sum_semaphores(void *rank) {long my_rank = (uintptr_t) rank;long long i;double a, b;long long my_n = n / thread_count;long long my_first_i = my_n * my_rank;long long my_last_i = my_first_i + my_n;for (i = my_first_i; i < my_last_i; i++) {a = (i * h) * (i * h) + (i * h);//x2+xb = ((i + 1) * h) * ((i + 1) * h) + ((i + 1) * h);//x2+xsem_wait(&semaphore);sum_semaphores += (a + b) * h / 2;sem_post(&semaphore);}
}
🐱🐉二、运行结果

更多好文推荐
🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻
| 上一篇 | End | 下一篇 |
相关文章:
2023-4-10-用Pthreads计算积分
🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥💟💟喜欢的朋友可以关注一下࿰…...
什么是js?js的基本使用
JavaScript(简称“ js”) 是一种具有函数优先的轻量级,解释型或即时编译型的编译语言虽然它是作为开发WEB页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言&a…...
自然数的拆分问题 字典序
目录 自然数的拆分问题 字典序 程序设计 程序分析 自然数的拆分问题 字典序 对于大于1的自然数N,可以拆分成若干个大于等于1的自然数之和。 Input 一个大于1的自然数N Output 所有的拆分情况.按字典序排列。 Sample Input...
软件测试——概念篇
目录 一、软件的生命周期 二、瀑布模型(Waterfall Model) 优点: 缺点: 三、螺旋模型(Spiral Model) 编辑优点: 缺点: 四、增量、迭代 区别: 五、敏捷 scrum…...
Qsort函数的应用与讲解
解释: qsort排序函数,即讲一段数组,字符串等进行有序的排列 分析: void qsort (void* base,//要排序的数组的首元素(就是数组名)size_t num, //要排序的数组元素的个数size_t size,//每个元素的字节大小&…...
蓝桥杯嵌入式第九届客观题解析
文章目录 前言一、题目1二、题目2三、题目3四、题目4五、题目5六、题目6七、题目7八、题目8九、题目910、题目10总结前言 本篇文章为大家带来第九届客观题的讲解。 一、题目1 STM32F103RBT6 微控制器是一款基于 ARM Cortex-M3 内核的单片机,它具有多个外设和总线,包括 APB1…...
多元函数的基本概念——“高等数学”
各位CSDN的uu们你们好呀,今天,小雅兰的内容是多元函数的基本概念,下面,让我们一起进入多元函数的世界吧 平面点集 多元函数的概念 多元函数的极限 多元函数的连续性 有界闭区域上多元连续函数的性质 平面点集 第一个是坐标平…...
LabVIEW-数值控件和布尔控件
简介 LabVIEW 以其强大、开放、图形化的虚拟仪器软件开发环境使得无论是否有过编程经验的工程师或科学家使用它时都可以快速、高效地与测量和控制硬件通信,并进行复杂的数据分析及处理。LabVIEW集成了满足GPIB、PXI、VXI、RS232、RS485、USB、DAQ等多种形式的设备互…...
R730重组阵列raid5
如何进入阵列界面,可以参考这篇文章:R730服务器热插拔换磁盘(raid阵列) 首先来到阵列界面:来到红框Disk Group处,然后按F2 然后移到箭头处,回车(删掉磁盘组) 然后发现…...
Verilog学习笔记3——数据位宽、阻塞/非阻塞赋值、二进制码、独热码、格雷码比较、编写原则、三态门、
文章目录前言一、数据位宽1、有符号定点数2、Nbit和Mbit相加或相乘二、阻塞赋值和非阻塞赋值三、timescale四、三态门的设计五、verilog模块编程原则六、二进制码、独热码、格雷码比较1、独热码2、格雷码3、二进制码前言 2023.4.5 清明节 一、数据位宽 N位有符号数࿱…...
C++ Qt智能指针使用教程
C++ Qt智能指针使用教程 contents 一、 QSharedPointer用法二、 QWeakPointer三、QScopedPointer四、QPointer五、Qt智能指针需要注意的坑Qt提供了类似C++11智能指针的实现,用于自动管理动态分配的内存,避免内存泄漏和悬挂指针等问题。使用智能指针可以使代码更加安全、简洁和…...
【题解】BZOJ4975 区间翻转
题目大意 两人博弈,有一个 nnn 的排列 a1,a2,…,ana_1,a_2,\dots,a_na1,a2,…,an,每次操作为选择长度为 4x24x24x2 或 4x34x34x3 的区间,将其翻转,要求翻转后字典序大于翻转前。第一个不能操作的输。Q 先手,T 后…...
火箭参数相关知识
火箭参数相关 前言:学习笔记,很初级部分内容来之相关书籍,入门学习,欢迎指正 1 坐标系右手定则: 伸开手掌,大拇指指向X轴,四指指向Y轴,四指弯曲90后所指向的方向为Z轴。X 、Y、Z并…...
【JavaEE】死锁是什么?如何避免死锁(保姆级讲解)
博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶本篇文章将介绍什么是死锁,死锁的四大必要条件,如何去避免死锁~~~ 目录 一、死锁是什么? 二、关于死锁的情况 2.1 一个线程的情况 2.2 两个线程的情况…...
JS 实现占位符截取字符串内容
//charnum占位长度, //str 字符串内容 //返回charnum占位长度 下的字符串长度; function getcharlength(charnum,str){ var len 0; for (var i 0; i < str.length; i) { var c str.charCodeAt(i); //单字节加1 …...
Prophet学习(四)趋势Changepoints
目录 趋势Changepoints(Trend Changepoints) Prophet中的自动更改点检测(Automatic changepoint detection in Prophet) 调整趋势灵活性(Adjusting trend flexibility) 指定变更点的位置(Spe…...
超表面学习 初步印象
超表面学习中 第一章 初步认识 一.传统超表面 1.吸波 2.反射相位 3.透射相位 4.电磁带隙 引申出来的超表面基础应用: 1.透波透镜(对应透射相位) 分为近场和远场 近场:贝塞尔波束等等 远场:方向图控制(对应…...
脂肪肝 肾结石 怎么得来的
脂肪肝怎么得来的1.脂肪肝2.肾结石是如何产生的?1.脂肪肝 是由于肝细胞内脂肪堆积过多引起的慢性疾病,引起脂肪肝的因素有多种,由于常常没有自觉症状,往往不易引起人们的重视。常见原因有以下几种: 第一、过量饮酒&a…...
Python 进阶指南(编程轻松进阶):一、处理错误和寻求帮助
原文:http://inventwithpython.com/beyond/chapter1.html 请您不要将计算机当成佣人,因为这样会让您常常感觉很烦躁。比如说当计算机向您显示错误消息时,并不是因为您冒犯了它。计算机是我们大多数人都会接触到的最复杂的工具,但归…...
windows服务器自带IIS搭建网站并发布公网访问【内网穿透】
文章目录1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置4.公网访问测试5.结语转载自远程源码文章:【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网穿透…...
570-‘基于坠落机制改进的混沌麻雀算法SSACD‘在23个标准测试函数上可直接运行Matlab语言
570-基于坠落机制改进的混沌麻雀算法SSACD在23个标准测试函数测试可直接运行 Matlab语言 改进点如下: 1.首先,引入Sinusoidal混沌映射和变尺度混沌策略对种群进行初始化,提高种群多样性使算法具备跳出局部最优解的能力 2.其次,引入…...
Transformers音频分类终极指南:3步实现智能环境音识别
Transformers音频分类终极指南:3步实现智能环境音识别 【免费下载链接】transformers huggingface/transformers: 是一个基于 Python 的自然语言处理库,它使用了 PostgreSQL 数据库存储数据。适合用于自然语言处理任务的开发和实现,特别是对于…...
Simulink模型到AUTOSAR RTE的‘最后一公里’:手把手教你处理ARXML接口冲突并自动配置ISOLAR
Simulink模型到AUTOSAR RTE的‘最后一公里’:手把手教你处理ARXML接口冲突并自动配置ISOLAR 在汽车电子软件开发中,Simulink与AUTOSAR工具链的集成已经成为行业标配。但当你满怀期待地将Simulink模型导出为ARXML文件,准备导入ISOLAR进行后续开…...
别让你的 Coding Agent 瞎忙活,你最缺的可能是这套 Harness 规则
别让你的 Coding Agent 瞎忙活,你最缺的可能是这套 Harness 规则 团队把 Claude Code、Codex、Cursor 这类工具接进日常开发后,最先暴露出的瓶颈通常在协作环节。 一个简单的 bug fix 任务,agent 可能会扩出十几个文件的改动。 跑了一行测试…...
CVPR2025新星DehazeXL:开源8K去雾数据集与可解释归因图,高分辨率图像处理新范式
1. 高分辨率图像去雾的痛点与DehazeXL的突破 第一次处理8K航拍图像时,我盯着显存不足的报错信息愣了半天——当时用的某知名去雾模型,光是加载81928192的图片就吃掉了48GB显存。这其实是高分辨率图像处理领域的普遍困境:传统方法要么被迫降采…...
【LaTeX】学术论文高效排版:从零搭建初稿模板
1. 为什么你需要LaTeX论文模板? 第一次写学术论文时,我像大多数人一样打开了Word。结果光是调整格式就花了三天——页码突然跑到封面中间、参考文献编号莫名其妙重置、公式和图片永远对不齐。直到导师扔给我一个.tex文件说"用这个",…...
MedGemma与Ray集成:分布式医学AI训练
MedGemma与Ray集成:分布式医学AI训练 1. 引言 医学AI模型训练正面临着一个关键挑战:随着模型参数量的增加和医学数据集的扩大,单机训练已经无法满足需求。一张高分辨率CT影像可能达到GB级别,而完整的医学影像数据集往往需要TB级…...
51:L构建容器与Kubernetes安全:蓝队的容器防御
作者: HOS(安全风信子) 日期: 2026-03-19 主要来源平台: GitHub 摘要: 当基拉开始攻击容器与Kubernetes环境时,传统的安全防御方法已无法满足需求。L开发容器与Kubernetes安全防御系统,保护容器环境的安全。…...
【仅限核心开发者知晓】Polars 2.0清洗Pipeline的4层IR抽象:为何比Pandas快11.8倍?源码注释级解读
第一章:Polars 2.0清洗Pipeline的演进本质与性能跃迁全景Polars 2.0 将清洗 Pipeline 从“惰性执行显式优化提示”升级为“全图级自动重写零拷贝流式调度”,其本质是将数据清洗从过程式编排转向声明式语义图推理。核心突破在于 LazyFrame 的物理计划生成…...
Ruby OpenAI用户行为分析:AI交互模式深度研究
Ruby OpenAI用户行为分析:AI交互模式深度研究 【免费下载链接】ruby-openai OpenAI API Ruby! 🤖🩵 Now with Assistants, Threads, Messages, Runs and Text to Speech 🍾 项目地址: https://gitcode.com/gh_mirrors/ru/ruby-…...
