Linux编程 多进程,多线程求解PI(圆周率)
题目:
多进程:
#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(圆周率)的更多相关文章
- [转帖]Windows和Linux对决(多进程多线程)
Windows和Linux对决(多进程多线程) https://blog.csdn.net/world_2015/article/details/44920467 太长了 还没看完.. 还是没太理解好 ...
- linux编程之多线程编程
我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面 ...
- 【转】 Linux下的多线程编程
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/07/280 ...
- Linux下的多线程编程
1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...
- 【转】Linux下的多线程编程
1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...
- 《转》Linux下的多线程编程
原地址:http://linux.chinaunix.net/doc/program/2001-08-11/642.shtml 1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程 ...
- Linux 多进程多线程相关概念
进程:可执行程序是存储在磁盘设备上的由代码和数据按某种格式组织的静态实体,而进程是可被调度的代码的动态运行.在Linux系统中,每个进程都有各自的生命周期.在一个进程的生命周期中,都有各自的运行环境以 ...
- Cpython解释器下实现并发编程——多进程、多线程、协程、IO模型
一.背景知识 进程即正在执行的一个过程.进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都 ...
- linux 下 多进程与多线程
[Linux]多进程与多线程之间的区别 http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请 ...
随机推荐
- 【题解】4879. 【NOIP2016提高A组集训第11场11.9】少女觉
Description 在幽暗的地灵殿中,居住着一位少女,名为古明地觉.据说,从来没有人敢踏入过那座地灵殿,因为人们恐惧于觉一族拥有的能力——读心.掌控人心者,可控天下. 咳咳.人的记忆可以被描述为一 ...
- 【python】随机数相关
http://www.cnblogs.com/yd1227/archive/2011/03/18/1988015.html 该博文写的很详细,备忘. 需要注意的是,写测试脚本的时候,不要将脚本命名成跟 ...
- Git002--安装
Git--安装 本文来自于:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00 ...
- python中函数的嵌套和作用域链
1.三元运算if条件成立的结果 if 条件 else 条件不成立的结果例如: a=20 b=10 c=a if a>b else b print(c) 2.命名空间 全局命名空间:创建的存储“变 ...
- Navicat 破解方法
一.介绍 Navicat是一套快速.可靠的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设.它的设计符合数据库管理员.开发人员及中小企业的需要.Navicat 是以直觉化的图形用户界面而建的 ...
- HashMap之扰动函数和低位掩码
我们都知道,hashMap在实现的时候,为了寻找在数组上的位置,主要做了两件事 int hash = hash(key); int i = indexFor(key, table.length); 这 ...
- 【洛谷UVA307】小木棍Sticks
小木棍Sticks[传送门] 算法的话:dfs+超强剪枝: (另外注意UVA上好像不接受万能头[因为万能头WA了两次,瑟瑟发抖]) 思路: 最直接的思路,枚举木棍长度来dfs,但这样很容易就TLE了. ...
- 2.etcd集群的安装(cfssl版)
etcd的安装注意两点 1.systemd的配置文件 2. 证书 1. 解决 systemd的问题,想安装指定版本的etcd可以通过 yum方式安装 etcd 可以获得 systemc 和 etc ...
- ZOJ 2706 Thermal Death of the Universe
Thermal Death of the Universe Time Limit: 10 Seconds Memory Limi ...
- E Easy problem
链接:https://ac.nowcoder.com/acm/contest/338/E来源:牛客网 Zghh likes number, but he doesn't like writing pr ...