多线程求行列式值
2016-05-31 09:37
381 查看
#include<iostream> #include<pthread.h> #include<cstdlib> #include<cstdio> #include<sys/time.h> #include<stdlib.h> #include<string.h> #include<iomanip> using namespace std; #define Max_Matrix_size 1000 #define Max_pthread_size 100 double Matrix[Max_Matrix_size][Max_Matrix_size]; int Matrix_size; int Thread_num; int Per_thread_do; double Per_thread_cal[Max_pthread_size]; double result = 0.0; pthread_mutex_t mut; double det_cal(double **mmatrix,int size){ if(size == 1){ return mmatrix[0][0]; } else{ double res = 0.0; double **matrix = (double **)malloc(sizeof(double*) * (size)); for(int i = 0;i < size - 1;i++){ matrix[i] = (double *)malloc(sizeof(double) * (size)); } for(int i = 0;i < size;i++){ for(int j = 1;j < size;j++){ for(int k = 0;k < size;k++){ if(k < i){ matrix[j - 1][k] = mmatrix[j][k]; } if(k > i){ matrix[j - 1][k - 1] = mmatrix[j][k]; } } } if(i % 2 == 0){ res += mmatrix[0][i] * det_cal(matrix,size - 1); } else{ res -= mmatrix[0][i] * det_cal(matrix,size - 1); } } for (int i = 0; i < size - 1; i++) { free(matrix[i]); } free(matrix); return res; } } void *t_hread(void *arg){ int q = *(int*)arg; double **matrix = (double **)malloc(sizeof(double*) * (Matrix_size)); for(int i = 0;i < Matrix_size;i++){ matrix[i] = (double *)malloc(sizeof(double) * (Matrix_size)); } if(q != Thread_num - 1){ for(int i = q * Per_thread_do;i < ((q + 1) * Per_thread_do);i++){ for(int j = 1;j < Matrix_size;j++){ for(int k = 0;k < Matrix_size;k++){ if(k < i){ matrix[j - 1][k] = Matrix[j][k]; } if(k > i){ matrix[j - 1][k - 1] = Matrix[j][k]; } } } if(i % 2 == 0){ Per_thread_cal[q] += Matrix[0][i] * det_cal(matrix,Matrix_size - 1); } else{ Per_thread_cal[q] -= Matrix[0][i] * det_cal(matrix,Matrix_size - 1); } } } if(q == Thread_num - 1){ for(int i = q * Per_thread_do;i < Matrix_size;i++){ for(int j = 1;j < Matrix_size;j++){ for(int k = 0;k < Matrix_size;k++){ if(k < i){ matrix[j - 1][k] = Matrix[j][k]; } if(k > i){ matrix[j - 1][k - 1] = Matrix[j][k]; } } } if(i % 2 == 0){ Per_thread_cal[q] += Matrix[0][i] * det_cal(matrix,Matrix_size - 1); } else{ Per_thread_cal[q] -= Matrix[0][i] * det_cal(matrix,Matrix_size - 1); } } } pthread_mutex_lock(&mut); result += Per_thread_cal[q]; pthread_mutex_unlock(&mut); for(int i = 0;i < Matrix_size - 1;i++){ free(matrix[i]); } free(matrix); pthread_exit(0); } int main(int argc,char *argv[]){ if(argc != 4){ cout<<"Input format:MATRIX_SIZE,THREAD_NUM,INPUT_FILE"<<endl; return 0; } memset(Per_thread_cal, 0.0, sizeof(Per_thread_cal)); Matrix_size = atoi(argv[1]); Thread_num = atoi(argv[2]); char *input = argv[3]; Per_thread_do = Matrix_size / Thread_num; pthread_mutex_init(&mut,NULL); freopen(input,"r",stdin); for(int i = 0;i < Matrix_size;i++){ for(int j = 0;j < Matrix_size;j++){ cin>>Matrix[i][j]; } } pthread_t thread[Max_pthread_size]; //int id[100]; int *id = (int *)malloc(sizeof(int) * (Thread_num)); struct timeval begin,end; gettimeofday(&begin,NULL); for(int i = 0;i < Thread_num;i++){ id[i] = i; pthread_create(&thread[i],NULL,t_hread,(void*)&id[i]); } for(int i = 0;i < Thread_num;i++){ pthread_join(thread[i],NULL); } free(id); cout<<fixed<<setprecision(2)<<result<<endl; gettimeofday(&end,NULL); int time = (end.tv_sec - begin.tv_sec) * 1000000 + (end.tv_usec - begin.tv_usec); printf("time: %d us\n", time); return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Python3写爬虫(四)多线程实现数据爬取
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- Lua中调用C++函数示例
- 浅谈chuck-lua中的多线程
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C++联合体转换成C#结构的实现方法
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析