题目:

链接


多进程:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h> #define n 100000000.0 int main()
{
int fd[];
// 创建二个 fd, fd[0] 管道用于读, fd[1] 管道用于写
pipe(fd); // 创建进程
pid_t pid;
for(int i = ; i < ; ++i)
{
pid = fork();
if(pid == )
{
double sum = 0.0;
for(int j = (int)(i*(n/)); j < (int)((i+)*(n/)); j++)
{
double temp = ( / ( + ((j + 0.5)/n)*((j + 0.5)/n)))*(1.0/n);
sum += temp;
}
write(fd[], &sum, sizeof(double));
exit();
}
}
//计算求和
double ans = 0.0;
for(int i = ; i < ; ++i)
{
double temp;
read(fd[], &temp, sizeof(double));
ans += temp;
} printf("the ans is %.20lf\n", ans); return ;
}

多线程:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pthread.h> void * sumpi1(void * arg);
void * sumpi2(void * arg); double * pret;
double * pret1;
double ret,ret1; int main()
{
//定义两个线程标识符
pthread_t pthread1, pthread2;
//两个线程退出后的返回值
void * thread1_return;
void * thread2_return;
//判断线程创建成功否
int check_create;
//判断线程退出成功否
int check_end; double ans = 0.0;
double n = 10000000.0;
// 创建两个线程
check_create = pthread_create(&pthread1, NULL, sumpi1, (void *)&n); if(check_create !=){
printf("Thread creation failed");
exit();
} check_create = pthread_create(&pthread2, NULL, sumpi2, (void *)&n); if(check_create !=){
printf("Thread creation failed");
exit();
} //等待第一个线程退出,并接收它的返回值(返回值存储在thread1_return)
check_end = pthread_join(pthread1, &thread1_return); if(check_end != ){
printf("Thread end failed");
exit();
}
printf("%.20lf\n" ,*(double *)thread1_return);
//cout << thread1_return << endl;
ans += (*(double*)thread1_return); //等待第二个线程退出,并接收它的返回值(返回值存储在thread2_return)
check_end = pthread_join(pthread2, &thread2_return); if(check_end != ){
printf("Thread end failed");
exit();
}
printf("%.20lf\n" ,*(double *)thread2_return);
ans += (*(double*)thread2_return); printf("the pi is %.20lf\n" ,ans); return ;
} void * sumpi1(void * arg)
{
double n = *(double *)arg;
ret1 = 0.0;
for(int i = ; i < n/; i++)
{
double temp = ( / ( + ((i + 0.5)/n)*((i + 0.5)/n)))*(1.0/n);
ret1 += temp;
}
//printf("%.20lf\n", ret1);
//double *
pret1 = &ret1;
pthread_exit((void*)pret1);
} void * sumpi2(void * arg)
{
double n = *(double *)arg;
ret = 0.0;
for(int i = n/; i <= n; i++)
{
double temp = ( / ( + ((i + 0.5)/n)*((i + 0.5)/n)))*(1.0/n);
ret += temp;
}
//double *
pret = &ret;
//printf("%.20lf\n", *pret);
pthread_exit((void *)pret);
}

Linux编程 多进程,多线程求解PI(圆周率)的更多相关文章

  1. [转帖]Windows和Linux对决(多进程多线程)

    Windows和Linux对决(多进程多线程) https://blog.csdn.net/world_2015/article/details/44920467 太长了 还没看完.. 还是没太理解好 ...

  2. linux编程之多线程编程

    我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面 ...

  3. 【转】 Linux下的多线程编程

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/07/280 ...

  4. Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...

  5. 【转】Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...

  6. 《转》Linux下的多线程编程

    原地址:http://linux.chinaunix.net/doc/program/2001-08-11/642.shtml 1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程 ...

  7. Linux 多进程多线程相关概念

    进程:可执行程序是存储在磁盘设备上的由代码和数据按某种格式组织的静态实体,而进程是可被调度的代码的动态运行.在Linux系统中,每个进程都有各自的生命周期.在一个进程的生命周期中,都有各自的运行环境以 ...

  8. Cpython解释器下实现并发编程——多进程、多线程、协程、IO模型

    一.背景知识 进程即正在执行的一个过程.进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都 ...

  9. linux 下 多进程与多线程

    [Linux]多进程与多线程之间的区别 http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请 ...

随机推荐

  1. LeetCode 114. Flatten Binary Tree to Linked List 动态演示

    把二叉树先序遍历,变成一个链表,链表的next指针用right代替 用递归的办法先序遍历,递归函数要返回子树变成链表之后的最后一个元素 class Solution { public: void he ...

  2. CentOS7 监控网络流量

    首先,以下介绍的流量监控工具安装之前均需要安装epel源, 安装epel源: [root@bogon ~]# yum -y install epel-release 安装 iftop 工具,查看各个连 ...

  3. web开发jsp页面遇到的一系列问题

    一:web总结 1.jsp页面知识点巩固 1.1字符串数字格式化转换 <%@ taglib prefix="fmt" uri="http://java.sun.co ...

  4. display:table的几个用法

    DIV+CSS的布局已经让表格布局几乎很少用到,除非表格语义性很强的情况. display:table解决了一部分需要使用表格特性但又不需要表格语义的情况, 尤其是DIV+CSS很不方便解决的问题,比 ...

  5. hdu6354 Everything Has Changed (圆的相交弧长)

    题目传送门 题意: 用一堆圆来切割一个圆心为原点,半径为R的圆A,问切割完毕后圆A外围剩余部分的周长(图中的红线部分). 思路: 首先判定圆与圆A的关系,这题我们只需要与A内切.相交的圆. 然后就是求 ...

  6. 问题处理——"无法导航到插入符号下的符号"

    最近编码时经常发现"转到定义"功能没法用了,代码一片灰.刚开始时重新编译一下项目或重启一下VS就恢复了,但到后面这两种方法都不管用了. 偶然下发现解决方案中很多项目的引用都出现了黄 ...

  7. form表单,登录用户,密码,按钮,提交、重置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. JavaScript的进制转换

    先介绍两个API: 一.number 类型的 toString 方法 语法 JavaScript: numberObject.toString( [ radix ] ) 参数 参数 描述 radix ...

  9. overload和override的含义和区别

    重载(overload)和重写/覆盖(override)是Java多态性的不同表现形式. 重载(overload) (1) 重载是通过不同的方法参数来区分的,如不同的参数个数.顺序.类型. (2) 不 ...

  10. [转载]解决Android studio新建项目慢的问题

    原文地址为:https://blog.csdn.net/easion_zms/article/details/73181402 Android Studio 好处很多,但是当从github上或者导入其 ...