第一个多线程程序——使用pthread

来源:互联网 发布:禁用usb接口软件 编辑:程序博客网 时间:2024/05/23 22:08
最近学习并行算法,先看了看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;
   
}

这个程序中包含了两个多线程函数:
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
原创粉丝点击