2023-4-10-用Pthreads计算积分

简介: 2023-4-10-用Pthreads计算积分

用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+x
        b = ((i + 1) * h) * ((i + 1) * h) + ((i + 1) * h);//x2+x
        while (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+x
        b = ((i + 1) * h) * ((i + 1) * h) + ((i + 1) * h);//x2+x
        pthread_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+x
        b = ((i + 1) * h) * ((i + 1) * h) + ((i + 1) * h);//x2+x
        sem_wait(&semaphore);
        sum_semaphores += (a + b) * h / 2;
        sem_post(&semaphore);
    }
}

🐱‍🐉二、运行结果



目录
相关文章
|
7月前
|
运维 监控 Serverless
函数计算产品使用问题之遇到函数排队的情况,是什么导致的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
存储 调度
HIMA F8650X 重新计算积分累加器项
HIMA F8650X 重新计算积分累加器项
HIMA F8650X 重新计算积分累加器项
|
C++
C++ 模块累积的理解
C++ 模块累积的理解
87 0
[模板 辛普森积分] Grazed Grains | NCPC2021 | 辛普森积分求圆的面积并
题目描述 This year, there have been unusually many UFO sightings reported. Nobody knows if they are caused by optical illusions, weather phenomena, or secret technology being tested by foreign powers (terrestrial or not). UFO enthusiasts across the world rejoice, and speculations run wild.
189 0
SAP MM 没有启用QM的前提下可以从QI库存里退货给Vendor?
SAP MM 没有启用QM的前提下可以从QI库存里退货给Vendor?
SAP MM 没有启用QM的前提下可以从QI库存里退货给Vendor?
AVX 指令集并行技术优化积分计算圆周率 π
AVX 指令集并行技术优化积分计算圆周率 π
122 0
AVX 指令集并行技术优化积分计算圆周率 π
|
PHP
复盘微信支付金额不正确问题解决过程——PHP浮点型计算
问题 2017年9月份,商城项目在运行过程中,购买某商品时如果在下单时没有完成付款,而是稍后再从“个人中心-我的订单”发起付款,则无法调起微信支付界面 思路 其他商品正常,说明导致问题的原因大概率是商品本身 只有从会员中心发起的付款存在此问题,说明大...
1401 0
库位不参与MRP运算的设置方法
1、单个物料的某个库位不参与MRP运算,MMSC里面设置该库位MRP值为1即可; 2、所有物料的某个库位不参与MRP运算,IMG->生产->物料需求计划->计划->定义每一个工厂的仓储地点MRP,将库位的MRP指示码设为1即可。
1251 0
|
供应链
库存周转率计算方法
库存周转率=年销售额/年平均库存值 还可以在分: 原材料库存周期率=年材料消耗额/原材料平均库存值 在制品库存周转率=生产产值/在制品平均库存值 希望能对你有所帮助 下面是相关参考 ---------------------- 传统的存货是指存放在仓库中的物品。
1389 0
由积分确定的函数列的极限
设 $f_0(x)$ 在 $[0,1]$ 上可积, $f_0(x)>0$, $$\bex f_n(x)=\sqrt{\int_0^x f_{n-1}(t)\rd t},\quad n=1,2,\cdots.
605 0