燕山大学多核程序设计实验报告
燕山大学多核程序设计实验报告

实验一Windows多线程编程一、实验目的与要求了解windows多线程编程机制掌握线程同步的方法二、实验环境和软件WindowsXPVC6.0三、实验内容创建线程:HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize,LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThreadId);四、实验程序#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>usingnamespacestd;voidThreadFrunc1(PVOIDparam){while(1){Sleep(1000);cout<<"ThisisThreadFrunc1"<<endl;}}voidThreadFrunc2(PVOIDparam){while(1){Sleep(1000);cout<<"ThisiskjjThreadFrunc2"<<endl; }}intmain(){inti=0;_beginthread(ThreadFrunc1,0,NULL);_beginthread(ThreadFrunc2,0,NULL);Sleep(3000);cout<<"end"<<endl;return0;}实验结果实验二蒙特卡罗法求PI一、实验目的和要求蒙特卡洛算法可理解为通过大量实验,模拟实际行为,来收集统计数据。
多核编程与并行计算实验报告 (1)

多核编程与并行计算实验报告姓名:日期:2014年 4月20日实验一// exa1.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;void ThreadFunc1(PVOID param){while(1){Sleep(1000);cout<<"This is ThreadFunc1"<<endl;}}void ThreadFunc2(PVOID param){while(1){Sleep(1000);cout<<"This is ThreadFunc2"<<endl;}}int main(){int i=0;_beginthread(ThreadFunc1,0,NULL);_beginthread(ThreadFunc2,0,NULL);Sleep(3000);cout<<"end"<<endl;return 0;}实验二// exa2.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<iostream>using namespace std;DWORD WINAPI FunOne(LPVOID param){while(true){Sleep(1000);cout<<"hello! ";}return 0;}DWORD WINAPI FunTwo(LPVOID param){while(true){Sleep(1000);cout<<"world! ";}return 0;}int main(int argc, char* argv[]){int input=0;HANDLE hand1=CreateThread (NULL, 0, FunOne, (void*)&input, CREATE_SUSPENDED, NULL); HANDLE hand2=CreateThread (NULL, 0, FunTwo, (void*)&input, CREATE_SUSPENDED, NULL);while(true){cin>>input;if(input==1){ResumeThread(hand1);ResumeThread(hand2);}else{SuspendThread(hand1);SuspendThread(hand2);}};TerminateThread(hand1,1);TerminateThread(hand2,1);return 0;}实验三// exa3.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream>using namespace std;int globalvar = false;DWORD WINAPI ThreadFunc(LPVOID pParam){cout<<"ThreadFunc"<<endl;Sleep(200);globalvar = true;return 0;}int main(){HANDLE hthread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);if (!hthread){cout<<"Thread Create Error ! "<<endl;CloseHandle(hthread);}while (!globalvar)cout<<"Thread while"<<endl;cout<<"Thread exit"<<endl;return 0;}实验四:// exa4.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;HANDLE evRead, evFinish;void ReadThread(LPVOID param){WaitForSingleObject (evRead ,INFINITE);cout<<"Reading"<<endl;SetEvent (evFinish);}void WriteThread(LPVOID param){cout<<"Writing"<<endl;SetEvent (evRead);}int main(int argc , char * argv[]){evRead = CreateEvent (NULL ,FALSE ,FALSE ,NULL) ;evFinish = CreateEvent (NULL ,FALSE ,FALSE ,NULL) ;_beginthread(ReadThread , 0 , NULL) ;_beginthread(WriteThread , 0 , NULL) ;WaitForSingleObject (evFinish,INFINITE) ;cout<<"The Program is End"<<endl;return 0 ;}实验五// exa5.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>using namespace std;int total = 100 ;HANDLE evFin[2] ;CRITICAL_SECTION cs ;void WithdrawThread1(LPVOID param){EnterCriticalSection(&cs) ;if ( total-90 >= 0){total -= 90 ;cout<<"You withdraw 90"<<endl;}elsecout<<"You do not have that much money"<<endl;LeaveCriticalSection(&cs) ;SetEvent (evFin[0]) ;}void WithdrawThread2(LPVOID param){EnterCriticalSection(&cs) ;if ( total-20 >= 0){total -= 20 ;cout<<"You withdraw 20"<<endl;}elsecout<<"You do not have that much money"<<endl;LeaveCriticalSection(&cs) ;LeaveCriticalSection(&cs) ;SetEvent (evFin[1]) ;}int main(int argc , char * argv[]){evFin[0] = CreateEvent (NULL,FALSE,FALSE,NULL) ;evFin[1] = CreateEvent (NULL,FALSE,FALSE,NULL) ;InitializeCriticalSection(&cs) ;_beginthread(WithdrawThread1 , 0 , NULL) ;_beginthread(WithdrawThread2 , 0 , NULL) ;WaitForMultipleObjects(2 ,evFin ,TRUE ,INFINITE) ;DeleteCriticalSection(&cs) ;cout<<total<<endl;return 0 ;}实验六:// exa6.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream.h>#define THREAD_INSTANCE_NUMBER 3LONG g_fResourceInUse = FALSE;LONG g_lCounter = 0;DWORD ThreadProc(void * pData) {int ThreadNumberTemp = (*(int*) pData);HANDLE hMutex;cout << "ThreadProc: " << ThreadNumberTemp << " is running!" << endl;if ((hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex.Test")) == NULL) { cout << "Open Mutex error!" << endl;}cout << "ThreadProc " << ThreadNumberTemp << " gets the mutex"<< endl;ReleaseMutex(hMutex);CloseHandle(hMutex);return 0;}int main(int argc, char* argv[]){int i;DWORD ID[THREAD_INSTANCE_NUMBER];HANDLE h[THREAD_INSTANCE_NUMBER];HANDLE hMutex;if ( (hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex.Test")) == NULL) { if ((hMutex = CreateMutex(NULL, FALSE, "Mutex.Test")) == NULL ) { cout << "Create Mutex error!" << endl;return 0;}}for (i=0;i<THREAD_INSTANCE_NUMBER;i++){h[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc,(void *)&ID[i],0,&(ID[i]));if (h[i] == NULL)cout << "CreateThread error" << ID[i] << endl;elsecout << "CreateThread: " << ID[i] << endl;}WaitForMultipleObjects(THREAD_INSTANCE_NUMBER,h,TRUE,INFINITE);cout << "Close the Mutex Handle! " << endl;CloseHandle(hMutex);return 0;}实验七// exa7.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<iostream.h>#define THREAD_INSTANCE_NUMBER 3DWORD foo(void * pData) {int ThreadNumberTemp = (*(int*) pData);HANDLE hSemaphore;cout << "foo: " << ThreadNumberTemp << " is running!" << endl;if ((hSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Semaphore.Test")) == NULL) {cout << "Open Semaphore error!" << endl;}cout << "foo " << ThreadNumberTemp << " gets the semaphore"<< endl;ReleaseSemaphore(hSemaphore, 1, NULL);CloseHandle(hSemaphore);return 0;}int main(int argc, char* argv[]){int i;DWORD ThreadID[THREAD_INSTANCE_NUMBER];HANDLE hThread[THREAD_INSTANCE_NUMBER];HANDLE hSemaphore;if ((hSemaphore = CreateSemaphore(NULL,0,1, "Semaphore.Test")) == NULL ) { cout << "Create Semaphore error!" << endl;return 0;}for (i=0;i<THREAD_INSTANCE_NUMBER;i++){hThread[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) foo,(void *)&ThreadID[i],0,&(ThreadID[i]));if (hThread[i] == NULL)cout << "CreateThread error" << ThreadID[i] << endl;elsecout << "CreateThread: " << ThreadID[i] << endl;}WaitForMultipleObjects(THREAD_INSTANCE_NUMBER,hThread,TRUE,INFINITE);cout << "Close the Semaphore Handle! " << endl;CloseHandle(hSemaphore);return 0;}实验八:// exa8.cpp : Defines the class behaviors for the application.//#include"stdafx.h"#include"exa8.h"#include"MainFrm.h"#include"exa8Doc.h"#include"exa8View.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CExa8AppBEGIN_MESSAGE_MAP(CExa8App, CWinApp)//{{AFX_MSG_MAP(CExa8App)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard file based document commandsON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CExa8App constructionCExa8App::CExa8App(){// TODO: add construction code here,// Place all significant initialization in InitInstance}/////////////////////////////////////////////////////////////////////////////// The one and only CExa8App objectCExa8App theApp;/////////////////////////////////////////////////////////////////////////////// CExa8App initializationBOOL CExa8App::InitInstance(){AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL #elseEnable3dControlsStatic(); // Call this when linking to MFC statically#endif// Change the registry key under which our settings are stored.// TODO: You should modify this string to be something appropriate// such as the name of your company or organization.SetRegistryKey(_T("Local AppWizard-Generated Applications"));LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates// serve as the connection between documents, frame windows and views.CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CExa8Doc),RUNTIME_CLASS(CMainFrame), // main SDI frame windowRUNTIME_CLASS(CExa8View));AddDocTemplate(pDocTemplate);// Parse command line for standard shell commands, DDE, file openCCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);// Dispatch commands specified on the command lineif (!ProcessShellCommand(cmdInfo))return FALSE;// The one and only window has been initialized, so show and update it.m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;}///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)// No message handlers//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()// App command to run the dialogvoid CExa8App::OnAppAbout(){CAboutDlg aboutDlg;aboutDlg.DoModal();}///////////////////////////////////////////////////////////////////////////// // CExa8App message handlers、实验九:using System;using System.Threading;class Test{static void Main(){ThreadStart threadDelegate = new ThreadStart(Work.DoWork);Thread newThread = new Thread(threadDelegate);newThread.Start();Work w = new Work();w.Data = 42;threadDelegate = new ThreadStart(w.DoMoreWork);newThread = new Thread(threadDelegate);newThread.Start();}}class Work{public static void DoWork(){Console.WriteLine("Static thread procedure.");}public int Data;public void DoMoreWork(){Console.WriteLine("Instance thread procedure. Data={0}", Data);}实验十:using System;using System.Threading;class Test{static int total = 100;public static void WithDraw1(){int n=90;if (n <= total){total -= n;Console.WriteLine("You have withdrawn. n={0}", n);Console.WriteLine("total={0}", total);}else{Console.WriteLine("You do not enough money. n={0}", n);Console.WriteLine("total={0}", total);}}public static void WithDraw2()int n = 20;if (n <= total){total -= n;Console.WriteLine("You have withdrawn. n={0}", n);Console.WriteLine("total={0}", total);}else{Console.WriteLine("You do not enough money. n={0}", n);Console.WriteLine("total={0}", total);}}public static void Main(){ThreadStart thread1 = new ThreadStart(WithDraw1);Thread newThread1 = new Thread(thread1);ThreadStart thread2 = new ThreadStart(WithDraw2);Thread newThread2 = new Thread(thread2);newThread1.Start();newThread2.Start();}}实验十一:// exa11.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<windows.h>#include<conio.h>#include<stdio.h>#define THREAD_INSTANCE_NUMBER 3LONG g_fResourceInUse = FALSE;LONG g_lCounter = 0;CRITICAL_SECTION cs;DWORD ThreadProc1(void * pData) {int ThreadNumberTemp = (*(int*) pData);printf("ThreadProc1: %d is running!\n",ThreadNumberTemp );EnterCriticalSection(&cs);printf("ThreadProc1 %d enters into critical section\n",ThreadNumberTemp);Sleep(1000);LeaveCriticalSection(&cs);return 0;}DWORD ThreadProc2(void * pData) {int ThreadNumberTemp = (*(int*) pData);printf("ThreadProc2: %d is running!\n",ThreadNumberTemp );EnterCriticalSection(&cs);printf("ThreadProc2 %d enters into critical section\n",ThreadNumberTemp);Sleep(1000);LeaveCriticalSection(&cs);return 0;}int main(int argc, char* argv[]){int i;DWORD ID1,ID2;HANDLE h1,h2;InitializeCriticalSection(&cs);printf("Create the critical section \n");h1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc1,(void *)&ID1,0,&(ID1));if (h1 == NULL)printf("CreateThread error %d \n",ID1);elseprintf("CreateThread %d \n",ID1);h2= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc2,(void *)&ID2,0,&(ID2));if (h2== NULL)printf("CreateThread error %d \n",ID2);elseprintf("CreateThread %d \n",ID2);WaitForSingleObject (h1,INFINITE);WaitForSingleObject (h2,INFINITE);printf("Delete the critical section \n");DeleteCriticalSection(&cs);getch();return 0;}。
程序设计实践实验报告

程序设计实践实验报告实验报告课程名称___ 程序设计实践______实验项目_______子程序设计实验仪器_______PC _____系别_ 计算机科学与工程____专业______软件工程__________班级/学号___B软工0701/2007011801学生姓名_____ XX____________实验日期____2009-3-26__________成绩_______________________指导教师_____XX______________.实验二子程序设计一、实验目的1. 学习和掌握参数传递的方法;2.学习和掌握递归调用;3.了解goto语句的使用;4.了解降低嵌套深度的方法;5.了解复杂度的度量。
二、实验要求1.通过编程实现,学习和理解参数传递和递归调用的使用。
2.使用goto语句编写程序,用非goto语句改写程序;3.了解减少嵌套层次和度量复杂度的方法。
三、实验内容和结果1. 参数传递(1)创建控制台应用程序项目(CLR)。
定义函数swap,swap函数有两个整型形参x,y,swap的功能为交换x和y的值,并依次显示出交换后的x,y的值。
主函数定义两个整型变量a,b,并赋不同的初值,依次显示a和b的值,调用swap 函数,a,b作为实参,再在主函数中依次显示a和b的值。
(值传递)编写并运行以上程序,分析运行结果,思考值传递中是否会改变实参的值。
(2)创建控制台应用程序项目,修改(1)中程序,使swap函数的参数为两个指向整型的指针,swap函数中交换指针所指向的内容;主函数中调用swap函数,交换整型变量a和b的值。
编写并运行修改后的程序,比较与(1)中程序运行结果的不同之处及原因。
(3)创建控制台应用程序项目,修改(1)中程序,采用引用方式传递函数的参数。
编写并运行修改后的程序,比较与(1)、(2)中程序运行结果的异同以及(2)、(3)程序中改写的难易程度。
int swap1(int x,int y){int temp;temp=x;x=y;y=temp;return 0;} //实参传递函数int swap2(int &x,int &y){int temp;temp=x;x=y;y=temp;return 0;}//形参传递函数int swap3(int *x,int *y){int temp;temp=*x;*x=*y;*y=temp;return 0;}//指针传递函数int main(){int a,b;Console::WriteLine ("plesae input a and b interger:");a=Int32::Parse(Console::ReadLine());b=Int32::Parse(Console::ReadLine());Console::WriteLine ("实参传递函数交换a和b:");Console::WriteLine ("起始a和b:"+a+" "+b);swap1(a,b);Console::WriteLine ("交换后a和b:"+a+" "+b);Console::WriteLine ("-------------------");Console::WriteLine ("形参传递函数交换a和b:");Console::WriteLine ("起始a和b:"+a+" "+b);swap2(a,b);Console::WriteLine ("交换后a和b:"+a+" "+b);Console::WriteLine ("++++++++++++++++");Console::WriteLine ("指针传递函数交换a和b:");Console::WriteLine ("起始a和b:"+a+" "+b);swap3(&a,&b);Console::WriteLine ("交换后a和b:"+a+" "+b);Console::WriteLine ( "%%%%%%%%%%%%%%%%%" );Console::ReadLine();return 0;}2.递归调用.使用递归时,请注意如下原则:a.确认递归能够停止(子程序中至少含有一条非递归的路径);b.把递归限制在一个子程序内;c.留心栈空间;使用递归前,先考虑可否用其他方式编写程序,可能效果更好。
操作系统课程设计多线程

燕山大学课程设计说明书————操作系统题目:多道程序缓冲区协调操作班级:计算机应用2班开发小组名称:Beyond软件开发小组课题负责人:张鹏课题组成员:姓名学号班级自评成绩张鹏 0901******** 应用2班 A李倩 0901******** 应用2班 B 课题开发日期:2012.1.9—2012.1.131.1课程设计目的本次课程设计的主要目的是通过模拟多道程序缓冲区协调操作,充分理解操作系统中进程、线程及线程间同步和互斥的概念;并通过自己编写程序了解软件开发流程,锻炼自己的编程能力,充分提高自己的综合能力。
1.2主要完成任务模拟设定PUT 、GET 、Move 操作的如下图所示,有多个PUT 操作要不断循环地向Buffer1送数据,有Move1操作和Move2操作要不断地将Buffer1的数据取到Buffer2和Buffer3,有多个GET 操作要不断地从Buff2和Buffer3中取数据。
PUT 、 MOVE 、 GET 每次操作一个数据,为了在操作的过程中要保证数据不丢失, 每个Buffer 每次只能接受一个PUT 或一个Move 或一个Get ,多个操作不能同时操作同一BUFFER 。
PUT MOVE GET 软件能显示各个Buffer 的操作过程和每个Buffer 中的现有数据,放入、取出的总数据,可以设置Buffer 的容量及放入、取出数据的速度 ,设置put 、move 、get 操作的线程数和操作速度,软件结束运行时可以显示汇总数据,并能将统计结果保存到任意的路径下。
1.3解决的主要问题在本次课程设计中解决的重要问题有线程间的同步和互斥问题,java 语言软件设计中面向对象思想各个类的创建方法及类之间互相操作问题,软件界面设计问题。
2. 设计使用的基本概念和原理2.1多道程序多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使他们在管理程序控制下,相互穿插运行。
Get2Put Move2 Buff1 Buff2 Buff3 Move1 Get1进程是并发程序的执行,是多道程序系统中程序的执行过程。
【免费下载】 燕山大学多核程序设计实验报告

产生 2n 个随机数据,范围[0,1],对每个数据点计算其坐标是否满
足 x 2 y 2 1 ,统计满足此关系的点的数量 count,则
1
为 1。正方形面积 S1=1,圆弧内面积 S2= 4
大量点随机落在此正方形区域内,落在圆弧内的点的数量(n2)与点的总 数(n1)的比例与面积成正比关系。即
由此可得
n1 S1 4 n2 S2
4n2
n1
因此,只要计算出落在圆弧内的点的数量在点总数中所占的比例,就能求
出 的值。
1
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
燕山大学软件工程课程设计报告完整版

燕山大学软件工程课程设计报告HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】燕山大学软件工程课程设计说明书题目:网上书店学院(系):信息科学与工程学院年级专业:10级计算机应用三班学号:学生姓名:方小雨学号:学生姓名:王嘉恺指导教师:邓成玉教师职称:教授燕山大学课程设计(论文)任务书2013年6 月21 日燕山大学课程设计评审日第一章绪论课题背景在网络信息日益发展的今天,网络已经成为人们日常生活的一部分。
网上购物也成为现代社会的趋势和潮流。
而随着互联网的飞速发展以及我国经济的稳步平衡增长,人们对于精神文明也愈加看重,对于知识的追求也却来越高。
因而图书市场开始繁荣起来。
但由于各种各样的原因使得消费者在选购图书时不能迅速找到合意的书籍。
近年来网上书店也在网络经济的刺激下开始发力,各类资本纷纷注入这一充满潜力的新型市场。
由于网上书店图书种类包罗万象,且价格比传统书店便宜不少,以至于越来越多的消费者青睐于网上购书。
1999年,国内真正意义上第一家网上书店——当当网上线。
北京大学社会学专业毕业、从国家机关辞职下海的李国庆,拿着第一笔风险投资的基金开始了自己的网店生涯。
8年后,这家号称全球最大中文网上书店的企业营业额已经达到8个亿。
此后,伴随着世界电子商务浪潮的到来,越来越多的网上书店在国内兴起。
课题目的消费者都想在最短的时间内购买到自己所需的图书。
但现有大型电商平台音像书籍分类下书目繁多,给人们在繁忙的工作生活中购书带来了很大的麻烦,于是如何方便快捷的购买到自己所需的图书就成了人们较为关心的问题。
本小组成员经过网上查询资料和实地调查发现,燕山大学附近只有3家传统书店且规模较小。
稍微上点规模的城市之光也因为盗版原因存在着质量问题,价格也比京东等大型电商高出两成左右。
而大型网上书店虽然品种杂多,但缺少高等院校适用的教材,在快递方面最快也要一天才可到达学校。
燕山大学课程设计说明书

燕山大学课程设计说明书课程设计名称:操作系统题目:多道程序缓冲区协调操作班级:11级计算机应用1班开发小组名称:多道程序缓冲区协调操作的程序设计课题负责人:吴楠课题组成员:姓名吴楠学号 110104010058班级应用1班自评成绩姓名王乐学号 110104010045班级应用1班自评成绩课题开发日期:2014.1.101 概述1.1 课程设计目的通过编写一个生产者消费者的实例,了解多线程的创建,运行原理,通过信号量机制的运用了解各线程间的协调工作机制;通过实现界面编程,了解MFC 编程思想。
1.2 主要完成的任务如下图所示,有多个PUT 操作要不断循环地向Buffer1送字符数据,有Move1操作不断地将Buffer1的数据取到Buffer2,Move2操作不断地将Buffer1的数据取到Buffer3,有多个GET 操作要不断地从Buffer2和Buffer3中取数据。
PUT 、 MOVE 、 GET 每次操作一个数据,为了在操作的过程中要保证数据不丢失, 每个Buffer 每次只能接受一个PUT 或一个Move 或一个Get 。
运用进程同步和互斥机制设计一个多道程序完成上述操作。
图1 Buffer 操作(1) 可以随机产生字符数据,由put 操作放入Buff1,buffer 中容量单位是字符。
(2)提供良好图形界面,显示Buffer 的操作过程。
(3) 可以设定各Buffer 的容量、PUT 、GET 、Move 操作的个数;(4) 可以设定PUT 、GET 、Move 操作的速度;(5) 实时显示每个Buffer 中数据的个数和数据的内容,空闲Buffer 的空间的个数;(6) 实时显示线程、进程所处于等待(阻塞)状态的个数(7)程序运行结束,显示汇总数据:总的运行时间;Buffer 中数据的个数;已放入BUFFER 的数据个数;已取出的数据个数;平均每个buffer 中的数据个数。
Put Move2 Buff1 Buff2 Buff3 Get Move1 Get1.3 课程设计使用的开发语言和工具语言:C++开发环境:Visual Studio 2008及其开发环境下的MFC平台。
多核实验报告

实验报告课程名称:多核多线程技术院(系):信息与控制工程学院专业班级:计算机科学与技术姓名:学号:0906201指导教师:2012年11月21日实验一Windows API多线程编程本实验分为四个模块;分别为基础练习,临界区实验,事件实验,信号量实验。
通过本次实验逐步熟悉和掌握Win32 API多线程编程的语法结构、基本思路和方法。
理解API 之间的调用关系,参数的含义。
一、实验目的1、掌握MS V isual Studio 2010编写编译Win32 API多线程程序的方法;2、掌握Win 32 API编写多线程程序的语法;3、掌握Win 32 API编写多线程程序的思路;4、掌握Win 32多线程API的应用;5、能解决简单的数据竞争。
二、实验环境1、Windows XP系统2、Microsoft Visual Studio 2010三、相关知识1、内核对象的概念:由操作系统内核分配的,只能由内核访问的一个内存块,用来供系统和应用程序使用和管理各种系统资源。
2、Windows多线程API的基本管理线程的创建:HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);线程的终止:VOID ExitThread(DWORD dwExitCode)BOOL CloseHandle (HANDLE hObject)线程的挂起与恢复:DWORD SuspendThread(HANDLE hThread)DWORD ResumeThread(HANDLE hThread)线程间的等待:DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);DWORD WaitForMultipleObjects (DWORD nCount,CONST HANDLE *lpHandles,BOOL fWaitAll,DWORD dwMilliseconds);3、线程间的同步与临界区相关的API:void WINAPI InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); void WINAPI EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection); void WINAPI DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);与事件相关的API:HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCSTR lpName);DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);DWORD WaitForMultipleObjects (DWORD nCount,CONST HANDLE *lpHandles,BOOL fWaitAll,DWORD dwMilliseconds);BOOL SetEvent(HANDLE event );BOOL ResetEvent(HANDLE event );与信号量相关的API:HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpEventAttributes,LONG lSemInitial,LONG lSemMax,LPCSTR lpSemName);DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);DWORD BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG cReleaseCount,LPLONG lpPreviousCount);四、实验原理线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一Windows多线程编程一、实验目的与要求了解windows多线程编程机制掌握线程同步的方法二、实验环境和软件WindowsXPVC6.0三、实验内容创建线程:HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize,LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThreadId);四、实验程序#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>usingnamespacestd;voidThreadFrunc1(PVOIDparam){while(1){Sleep(1000);cout<<"ThisisThreadFrunc1"<<endl;}}voidThreadFrunc2(PVOIDparam){while(1){Sleep(1000);cout<<"ThisiskjjThreadFrunc2"<<endl; }}intmain(){inti=0;_beginthread(ThreadFrunc1,0,NULL);_beginthread(ThreadFrunc2,0,NULL);Sleep(3000);cout<<"end"<<endl;return0;}实验结果实验二蒙特卡罗法求PI一、实验目的和要求蒙特卡洛算法可理解为通过大量实验,模拟实际行为,来收集统计数据。
本例中,算法随机产生一系列点,模拟这些点落在如下图所示的正方形区域内的情况。
其几何解释如下1轴YX轴 1图1如图1所示,正方形边长为1,左下顶点与原点重合,两边分别与x,y轴重合。
曲线为1/4圆弧,圆心位于原点,与正方形左下定点重合,半径为1。
正方形面积S1=1,圆弧内面积S2= 121r。
算法模拟大量44点随机落在此正方形区域内,落在圆弧内的点的数量(n2)与点的总数(n1)的比例与面积成正比关系。
即n 1 n 2 S1S24(1)由此可得4n2(2)n1因此,只要计算出落在圆弧内的点的数量在点总数中所占的比例,就能求出的值。
由图1可知,所有点均落在正方形范围内,因此点的x坐标满足0x1。
2y2又,当点落在圆弧范围内,则点的二维坐标关系满足x1。
3二、实验环境和软件编译器:MicrosoftVisualStudioC++6.0操作系统:WindowsXP三、实验内容3.1串行算法本项目中使用了标准C语言库中的产生随机数函数。
该函数原型为:intrand(void);此函数产生随机数列,每次调用时均返回0到RAND_MA之X间的一个整数。
voidsrand(unsignedintseed);此函数为rand()函数所生成的伪随机数序列设置起始点,使之产生不同的伪随机数。
算法:产生2n个随机数据,范围[0,1],对每个数据点计算其坐标是否满足2y2x1,统计满足此关系的点的数量count,则count4n3.2并行算法描述算法步骤:1、确定需要产生的点的个数n,参与运行的处理器数m;2、对每一个处理器,生成两个随机数x,y,范围[0,1];2y23、判断两个随机数x,y是否满足x1;4、若满足,则变量COUNTi++;5、重复步骤2-4,直至每个处理器均生成n/m个随机点;6、收集COUNTi的值,并累加至变量COUNT中,此即为随机点落在圆弧内的数量;7、通过(2)式计算的值。
4#include<stdio.h>#include<windows.h>#include<time.h>//#include<process.h>#include<iostream>#include<fstream>#include<stdlib.h>usingnamespacestd;HANDLEevFinish;longcs=0;//总循环次数longcount=0;//主线程有效次数longcount_thread=0;//thread线程有效次数time_tstart,finish;//定义开始结束时间//thread线程计算量为总数的一半DWORDWINAPIthread(LPVOIDparam){inti=0;doublex,y;for(i=0;i<cs/2;i++){x=(longdouble)rand()/(longdouble)RAND_MAX;y=(longdouble)rand()/(longdouble)RAND_MAX;if((x*x+y*y)<=1)count_thread++;//printf("副%d",i);}SetEvent(evFinish);return0;}//主线程计算量为总数的一半intmain(void){evFinish=CreateEvent(NULL,FALSE,FALSE,NULL);printf("请输入总循环次数:");scanf("%d",&cs);cs*=1000000;srand((unsigned)time(NULL));//用时间作随机数种子start=time(NULL);//记录开始时间HANDLEid=CreateThread(NULL,0,thread,NULL,0,NULL);//创建thread线程inti=0;doublex,y;for(i=0;i<cs/2;i++){x=(longdouble)rand()/(longdouble)RAND_MAX;y=(longdouble)rand()/(longdouble)RAND_MAX;if((x*x+y*y)<=1)count++;//printf("主%d",i);//printf("count%d",count);}WaitForSingleObject(evFinish,INFINITE);//两线程同步count+=count_thread;finish=time(NULL);//记录结束时间printf("并行情况:\n\n");printf("用时=%f秒\n",difftime(finish,start));//计算时间差printf("总共的循环次数=%d次\n",cs);printf("线程有效次数=%d次\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=(longdouble)rand()/(longdouble)RAND_MAX;y=(longdouble)rand()/(longdouble)RAND_MAX;if((x*x+y*y)<=1)count++;//printf("主%d",i);//printf("count%d",count);}finish=time(NULL);//记录结束时间printf("用时=%f秒\n",difftime(finish,start));printf("总共的循环次数=%d次\n",cs);printf("线程有效次数=%d次\n",count);printf("pi=%f\n",4*(double)count/(double)cs);return(0);}实验结果:测试数据集合:由随机数函数产生的数据集合实验三并行排序一、实验目的与要求在单核计算环境中,排序算法关注的核心问题是怎样减少要排序数据之间的比较次数或算法所需要的内存空间。
在多核计算环境中,每个核以线程为执行单元,排序程序可以通过生成相互协作的线程来完成排序。
与单核计算环境不同的是,在多核计算环境中更关注数据集的合理划分,更致力于识别可并行执行的任务。
一旦完成这些工作,程序设计上就可以生成对应的线程去执行任务。
理论上,基于相同的串行算法和相同的c ac h e 命中率,多核计算速度可以无限核计 算速度的P 倍,其中P 为核的数目。
多核上的并行排序算法所面临的问题在于: 1.未排序的数据集合理划分到每个线程后,最后怎么汇合,形成完整的 排好序的数据集呢? 2.怎么保证可并行执行的线程的数目和核的数目相等或稍微多于核的数 目,同时也保证这些线程之间的工作量也尽可能的相同呢? 在这个实验中,串行的算法采用标准C 语言库中的快速排序函数。
并行算法中,先将要处理的数据集均等的分到每个线程中,并使用C 语言 库中的快速排序函数各自排序。
然后所有线程开始根据相同的数对自己的 数据集进行划分,这个数是依据一定的方法选出来的(详见并行算法描述)。
每个线程的数据集都会被分成K 份,(其中P<=K<P2,P 为核的数目), 每份将被称为一桶。
很显然这个过程选出了K 个数,这些数将被成为 bound_value,记为X1,X2,X3⋯⋯XK 。
最后每个线程中小于或等于X1 的数会被一个独立的线程去归并排序,同样小于或等于X2的数也会被另外 一个独立的线程去归并排序,依次类推,直到排好序。
需要指出的是:这个并行版本最消耗时间的部分是一开始每个线程各自的 排序,时间为:O (nlogn );不过其数据划分和线程生成也相对简单。
最 后的归并排序所需时间是线性增长的,即:O (n ),因此即使在最后归并 部分线程执行的任务已经是不均衡的,也不会对整个程序的性能产生很大 的影响。
二、实验环境和软件编译器:MicrosoftVisualStudioC++6.0 操作系统:WindowsXP三、实验内容3.1并行算法描述 算法:将原始待排序的数据分成P 等份,每个处理器上对N0个数据进行排序,称 每个被排序后的子集为B0,⋯,Bp-1 Remain_data=N ,设定第0组归并起始位置全部为0,i=0,设置第0组在目标数组中的起始0 循环直至r emian_data<L(L=N0/P) 3.1选取所有子集中起始位置后续L 个元素的最小值bound_value ,并获 得bound_value 的桶号bucket 3.2在所有子集中从起始位置到后续L 个元素中选取边界位置,使得边界 位置的最后一个元素小于或等于bound_value ,而边界位置后的第一元素 大于bound_value 。