第一节课:
估算面积分析 曲线y=-x4+x3+1与x轴围成的面积 图形范围: -1 < x < 2, 0 <= y < 2.2 整体面积为 6.6 划成小块,以块大小0.1*0.1为例 X方向分为30块 Y方向分为22块 计算每一块是否在图形中 面积=6.6*图形中的块数/总块数
参考代码
#include <stdio.h> #include <stdlib.h> #include <pthread.h> //计算1/1+1/2+1/3+1/4+…+1/1000 double res; // res是全局变量,用来计算最终的结果 typedef struct Args { long n; long begin; long step; } Args; void *cal(void *arg); int main(int argc, char *argv[]) { long i; long n = atol(argv[1]); // n为计算的数据量 int np = atoi(argv[2]); // np为线程数 Args *arg; double* val; pthread_t *pid; // 用于声明线程ID pid = (pthread_t *)malloc(np * sizeof(pthread_t)); res = 0.0; for (i = 0; i < np; i++) { arg = (Args *)malloc(sizeof(Args)); arg->n = n; arg->begin = i+1; arg->step = np; pthread_create(&pid[i], NULL, cal, (void *)arg); } for (i = 0; i < np; i++) { pthread_join(pid[i], (void *)val); // 用来等待一个线程的结束,线程间同步的操作 } printf("233#%lf ", res); free(pid); return 0; } void *cal(void *_arg) { long i; double val; Args *arg = (Args *)_arg; val = 0.0; for (i = arg->begin; i <= arg->n; i += arg->step) { val += 1.0 / i; } res += val; return NULL; }
我的代码
出错的地方:
(1)运行qsub命令时,报错script is written in DOS/Windows text format。
解决办法:输入 dos2unix <pbs-script-file> (就是dos2unix filename)
(2)使用argv传递5个参数时结果总是不对,错误的地方是错用了atol,我传入的参数时double型,需要使用atof来将字符串转换为double型,使用atol会转换成long型