最近学习并行算法,先看了看pthread多线程编程。今天写了第一个算法,就是求10000个数的和。算法很简单,用了两个线程,第一个求前5000个数的和,第二个求后5000个的和,然后把两个线程的结果加起来。
程序如下:
#include <pthread.h>
#include <cstdlib>
#include <iostream>
using namespace std;
#define NUM_THREAD 2
// 线程调用的函数的参数
struct add_arg
{
int* data;
int size;
int left;
int right;
int* sum;
};
//计算序列的和,这个函数由线程调用
void *add(void* addarg)
{
struct add_arg *arg;
arg = (struct add_arg*)addarg;
int i;
arg->sum[0] = 0;
cout<<arg->size<<" "<<arg->left<<" "<<arg->right<<endl;
for(i=arg->left;i<=arg->right;i++)
arg->sum[0] += arg->data[i];
cout<<arg->sum[0]<<endl;
}
//序列求和的算法,包含两个线程
int addnum(int *A, int size)
{
int i;
struct add_arg arg[2];
arg[0].data = A;
arg[0].size = size;
arg[0].left = 0;
arg[0].right = int(size/2);
arg[0].sum = new int;
arg[1].data = A;
arg[1].size = size;
arg[1].left = arg[0].right+1;
arg[1].right = size-1;
arg[1].sum = new int;
pthread_t thread[2];
int rc;
for(i=0;i<2;i++){
//创建线程
rc = pthread_create(&thread[i],NULL,add,(void* )&arg[i]);
//等待线程完成
pthread_join(thread[i],NULL);
}
cout<<arg[0].sum[0]+arg[1].sum[0]<<endl;
return *arg[0].sum+*arg[1].sum;
}
int main()
{
int* A = new int[10000];
int i;
for(i=0;i<10000;i++){
if(i%2==0) A[i] = i;
else A[i] = i;
}
int sum = addnum(A,10000);
cout<<"the sum is : "<<sum<<endl;
}
这个程序中包含了两个多线程函数:
程序如下:
#include <pthread.h>
#include <cstdlib>
#include <iostream>
using namespace std;
#define NUM_THREAD 2
// 线程调用的函数的参数
struct add_arg
{
int* data;
int size;
int left;
int right;
int* sum;
};
//计算序列的和,这个函数由线程调用
void *add(void* addarg)
{
struct add_arg *arg;
arg = (struct add_arg*)addarg;
int i;
arg->sum[0] = 0;
cout<<arg->size<<" "<<arg->left<<" "<<arg->right<<endl;
for(i=arg->left;i<=arg->right;i++)
arg->sum[0] += arg->data[i];
cout<<arg->sum[0]<<endl;
}
//序列求和的算法,包含两个线程
int addnum(int *A, int size)
{
int i;
struct add_arg arg[2];
arg[0].data = A;
arg[0].size = size;
arg[0].left = 0;
arg[0].right = int(size/2);
arg[0].sum = new int;
arg[1].data = A;
arg[1].size = size;
arg[1].left = arg[0].right+1;
arg[1].right = size-1;
arg[1].sum = new int;
pthread_t thread[2];
int rc;
for(i=0;i<2;i++){
//创建线程
rc = pthread_create(&thread[i],NULL,add,(void* )&arg[i]);
//等待线程完成
pthread_join(thread[i],NULL);
}
cout<<arg[0].sum[0]+arg[1].sum[0]<<endl;
return *arg[0].sum+*arg[1].sum;
}
int main()
{
int* A = new int[10000];
int i;
for(i=0;i<10000;i++){
if(i%2==0) A[i] = i;
else A[i] = i;
}
int sum = addnum(A,10000);
cout<<"the sum is : "<<sum<<endl;
}
这个程序中包含了两个多线程函数:
int pthread_create (pthread_t *thread, const pthread_attr_t *attr, void
*(*start_routine) (void *), void *arg) ;
创建一个线程
他的文档可以参考这里
int pthread_join (pthread_t thread, void **value_ptr);
他的文档可以参考这里
g++ -pthread add.cpp -o add
./add
运行结果如下:
10000 0 5000
12502500
10000 5001 9999
37492500
49995000
the sum is : 49995000