注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

刘邓

每天收获一点点-目标:富足

 
 
 

日志

 
 

并发/并行的开端  

2012-07-11 21:14:19|  分类: 技术类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
今天终于算是把《深入理解计算机系统》“看”完了一遍,内容其实不是很难,但是信息量非常的大,涵盖的面也非常的广,这几天一直在看这本书的第三部分,感觉这一部分比《APUE》更适合当Linux/Unix编程的入门书,在这一部分的开头,看到了一段不知道时原作者还是译者添加的话,挺好玩的:
        当你学玩这个部分,你将逐渐变成一个很牛的程序员,对计算机系统以及它们对编程的影响又很成熟的理解。

/*
这是一个用多线程进行1...n进行累加运算的程序,为了让满足不使用可修改的全局变量,我采用的是以CArg结构体的方式传递参数,这是

因为pthread_create只能接受一个参数,故如果想传递多个参数只能以结构体的方式传递,这个程序的原型来着《深入》,修改了全局

变量部分。并发/并行博大精深啊。

*/

#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include<sys/types.h>//System typedef
#include<pthread.h>
#define MAXTHREADS 32
long nelems =16 ;
long pcnt = 16/ 3;
typedef struct
{
long myid;
long *psum;
}CArg;
void * sum(void* vargp);
int main()
{
int nthreads = 3;
long sum = 0;
long psum[MAXTHREADS];
int i;
pthread_t tid[MAXTHREADS];
for(i = 0;i<nthreads;++i)
{
CArg *arg = malloc(sizeof(CArg));
arg->myid = i;
arg->psum = &(psum[i]);
pthread_create(&tid[i],NULL,sum,arg);
}
for(i = 0;i<nthreads;++i)
pthread_join(tid[i],NULL);
for(i = 0;i<nthreads;++i)
sum += psum[i];
if(sum!= (nelems)/2*(nelems-1))
printf("Error:result = %ld\n",sum);
return 0;
}
void* sum(void* vargp)
{
CArg *arg = (CArg*)vargp;
long start = arg->myid*pcnt+1;
long end ;
if(arg->myid == 2) end = nelems;
else end = start + pcnt -1;
long i ,sum;//这里采用临时变量sum进行下面的计算,而不是直接对arg->psum进行操作可以有效减少存储器访问
for(i = start;i<=end;++i)
sum += i;
*(arg->psum) = sum;
free(arg);
return NULL;
}


/*
第一个Fork程序,验证一个问题就是只有Fork()函数后面的代码才会被子进程执行,这虽然在意料之中,但还是实践以后更放心。
*/

#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
pid_t pid;
printf("Hello Fork!!!\n");
pid = fork();
if(pid == 0) printf("Child!!!\n");
else printf("Parent!!!\n");
printf("All!!!\n");
//printf("Hello world!\n");
return 0;
}

  评论这张
 
阅读(67)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017