一、准备工作
首先从
下载pthreads-w32-2-9-1-release.rar,解压后得到Pre-built.2文件夹
将其中的lib文件夹和include文件夹内容分别放到vs2008相应位置。
将其中dll文件夹中的文件与编译生成的exe放在同一目录下(一般为vs2008工程目录的Dubug或Release目录)。
二、程序编写
求π值近似公式:
程序源代码如下:
1 // exp1_pi.cpp : 定义控制台应用程序的入口点。 2 // 3 #include "stdafx.h" 4 #include5 #include 6 #include 7 using namespace std; 8 9 #pragma comment (lib,"pthreadVC2.lib")10 11 int n = 0;12 int threadnum = 0;13 double sum = 0;14 15 //初始化锁变量16 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;17 18 //线程函数,根据线程rank确定自身计算范围,进行计算,并将计算结果加至全局变量sum中19 void* Thread_sum(void* rank)20 {21 long my_rank = (long) rank;22 double factor;23 double my_sum = 0;24 long long i; 25 long long my_n = n/threadnum;26 long long my_first_i = my_n * my_rank;27 long long my_last_i = my_first_i + my_n;28 29 if(my_first_i % 2 ==0)30 factor = 1.0;31 else32 factor = -1.0;33 34 for(i = my_first_i; i < my_last_i; i++, factor = -factor)35 {36 my_sum += factor/(2*i+1);37 }38 39 //使用锁变量,保证对sum赋值操作的互斥性40 pthread_mutex_lock(&mutex);41 sum += my_sum;42 pthread_mutex_unlock(&mutex);43 44 return NULL;45 }46 47 int main(int argc, char *argv[]) {48 49 50 //从main函数接收参数,n为问题规模,threadnum为线程个数51 //n = atoi(argv[1]);52 //threadnum=atoi(argv[2]);53 n = 10000;54 threadnum = 8;55 56 pthread_t *calculator = new pthread_t[threadnum];57 58 //启动各个线程59 for(int rank = 0; rank < threadnum; rank++)60 {61 pthread_create(&calculator[rank],NULL,Thread_sum,(void*)rank); 62 }63 64 //主线程等待所有线程结束65 for(int j = 0;j
三、程序运行结果