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);
    }
}

🐱‍🐉二、运行结果



目录
相关文章
|
4月前
|
弹性计算 缓存 Serverless
函数计算产品使用问题之如何加快出图时间
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
运维 监控 Serverless
函数计算产品使用问题之遇到函数排队的情况,是什么导致的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
QuantLib学习笔记——利用quantlib绘制零息利率(zero rate)期限结构曲线
QuantLib学习笔记——利用quantlib绘制零息利率(zero rate)期限结构曲线
121 0
|
7月前
|
存储 算法 Linux
理解和使用 C++ 中的 `times` 函数:度量进程时间
理解和使用 C++ 中的 `times` 函数:度量进程时间
123 0
GROMACS运行参数之npt.mdp文件详解
GROMACS运行参数之npt.mdp文件详解
938 0
|
存储 调度
HIMA F8650X 重新计算积分累加器项
HIMA F8650X 重新计算积分累加器项
HIMA F8650X 重新计算积分累加器项
|
Python
python计算收益率的效率分析-sympy包-计算呈指数递增,大量计算不考虑
python计算收益率的效率分析-sympy包-计算呈指数递增,大量计算不考虑
152 0
python计算收益率的效率分析-sympy包-计算呈指数递增,大量计算不考虑
[模板 辛普森积分] 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.
182 0
AVX 指令集并行技术优化积分计算圆周率 π
AVX 指令集并行技术优化积分计算圆周率 π
114 0
AVX 指令集并行技术优化积分计算圆周率 π
DSP_代码笔记(基于TMS320X281x)| CPU定时器0模块
CPU定时器0模块初始化: #include "DSP28_Device.h" struct CPUTIMER_VARS CpuTimer0; //对用户开放的CPU定时器只有CpuTimer0,CpuTimer1 struct CPUTIMER_VARS CpuTimer1; //和CpuTimer2被保留用作实习操作系统OS(例如DSP struct CPUTIMER_VARS CpuTimer2; //BIOS) //初始化CpuTimer0。
1275 0