.
燕山大学多核程序设计实验报
实验一 Windows 多线程编程
一、实验目的与要求
了解 windows 多线程编程机制 掌握线程同步的方法
二、实验环境和软件
Windows XP
VC
三、实验内容
创重复步骤2-4,直至每个处理器均 生成n/m个随机点;
6、 收集COUNTi的值,并累加至变量 COUN中,此即为随机点落在圆弧内的 数量;
7、 通过(2)式计算的值。
#include<> #include<> #include <> //#include <> #include <iostream> #include <fstream> #include<> using namespace std;
HANDLE evFinish;
long cs=0; // 总循环次数
long count=0; // 主线程有效次数 long count_thread=0; //thread 线程 有效次数
time_t start, finish; // 定义开始结 束时间
//thread 线程计算量为总数的一半 DWORD WINAPI thread(LPVOID param) { int i=0;
10
double x,y;
for(i=0;i<cs/2;i++)
{
x=(long double)rand()/(long double)RAND_MAX;
y=(long double)rand()/(long
double)RAND_MAX;
if((x*x+y*y)<=1)
count_thread++;
//printf(" 副 %d ",i);
}
SetEvent(evFinish);
return 0;
}
// 主线程计算量为总数的一半
int main (void)
{
11 evFinish=CreateEvent(NULL,FALSE,F ALSE,NULL);
printf(" 请输入总循环次数 :");
scanf("%d",&cs);
cs*=1000000;
srand( (unsigned)time( NULL ) )
;// 用时间作随机数种子
start=time(NULL); // 记 录 开 始
时间
HANDLE
id=CreateThread(NULL,0,thread,NUL
L,0,NULL); // 创建 thread 线程
int i=0;
double x,y;
for(i=0;i<cs/2;i++)
{
x=(long double)rand()/(long double)RAND_MAX;
12 y=(long double)rand()/(long
double)RAND_MAX;
if((x*x+y*y)<=1)
count++;
// printf(" 主%d",i);
//printf("count%d",count);
}
WaitForSingleObject(evFinish,INFI
NITE);// 两线程同步
count+=count_thread;
finish=time(NULL); // 记录结束 时间
printf(" 并行情况: \n\n");
printf(" 用 时 =%f 秒
\n",difftime(finish,start));
// 计算时间差 printf(" 总共的循环 次数=%d次 \n",cs);
printf(" 线 程 有 效 次数 =%d 次
13
\n",count);
printf("pi= %f \n",4*(double)count/(double)cs);
printf(" 串行行情况: \n");
count=0;
start=time(NULL); // 记录开始时间
for(i=0;i<cs;i++)
{
x=(long double)rand()/(long
double)RAND_MAX;
y=(long double)rand()/(long
double)RAND_MAX;
if((x*x+y*y)<=1)
count++;
// printf(" 主%d",i);
//printf("count%d",count);
}
finish=time(NULL); // 记录结束时
14 间
printf(" 用 时 =%f 秒 \n",difftime(finish,start))
燕山大学多核程序设计实验报告 来自淘豆网m.daumloan.com转载请标明出处.