跟刘峰六学C语言(5) 线程栅栏

某些并行计算需要面临某些在计算进行前的某些单通瓶颈点,这种情况下,当然可以使用信号量的方式来进行处理,但是还存在着另外的一种处理方式是更加方便的,它就是:栅栏(在pthread库里面被定义成为类型 pthread_barrier_t),下面我们来看一段程序作为示例

 

 

代码
1 #define _XOPEN_SOURCE 600
2
3 #include <pthread.h>
4 #include <stdlib,h>
5 #include <stdio.h>
6
7  #define ROWS 10000
8  #define COLS 10000
9  #define THREADS 10
10
11 double initial_matrix[ROWS][COLS];
12 double final_matrix[ROWS][COLS];
13
14 //Barrier variable
15
16 pthread_barrier_t barr
17
18 extern void DotProduct(int row, int col, double source[ROWS][COLS], double destination[ROWS][COLS]);
19 extern void determinant(double matrix[ROWS][COLS]);
20
21 void * entry_point(void * arg)
22 {
23 int rank = (int)arg;
24 int row;
25 for(row=rank*ROWS/THREADS; row < (rank+1)*THREADS;++row)
26 for(int col=0;col<COLS;++col)
27 DotProduct(row,col,initial_matrix,final_matrix);
28
29 //synchronization pointer
30
31 int rc = pthread_barrier_wait(&barr);
32 if(rc!=0 && rc != PTHREAD_BARRIER_SERIAL_THREAD)
33 {
34 printf("Could not wait on barrier\n");
35 exit(-1);
36 }
37
38 for(row=rank*ROWS/THREADS; row < (rank+1)*THREADS;++row)
39 for(int col=0;col<COLS;++col)
40 DotProduct(row,col,final_matrix,initial_matrix);
41 }
42
43 int main(int argc, char* argv[])
44 {
45 int i;
46 pthread_t thr[THREADS];
47
48 //Barrier initialization
49
50 if(pthread_barrierattr_init(&barr,NULL,THREADS))
51 {
52
53 printf("Could not create a barrier\n");
54 return -1;
55 }
56
57 for(i=0;i<THREADS;++i)
58 {
59 if(pthread_create(&thr[i],NULL,&entry_point, (void*)i))
60 {
61
62 printf("Could not create thread %d\n", i);
63 return -1;
64 }
65 }
66
67 for(i=0;i<THREADS;++i)
68 {
69 if(pthread_join(thr[i],NULL))
70 {
71
72 printf("Could not join thread %d\n", i);
73 return -1;
74 }
75 }
76
77 double det = determinant(initial_matrix);
78 printf("The determinant of M^4 = %f\n", det);
79
80 return 0;
81
82 }
83

 

 

 

 

这段程序产生出许多个线程,并且分配给每个线程计算矩阵乘法的一部分,然后每个线程使用这次计算的结果,继续进行下一步的计算:另一个矩阵的乘法

几点关于API的说明:

  1. barrier 变量必须在最开始声名为全局变量
  2. barrier 变量的初始化必须在main函数里进行初始化
  3. 在点上每一个线程都会等待它的对端完成工作
注意

在程序顶部的宏定义 _XOPEN_SOURCE 是非常重要的;如果没有这个变量,那么barrier类型就会在pthread.h中被屏蔽掉,这个定义必须在所有的头文件引用之前被定义出来

 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2010/10/02/5918801.aspx

posted on 2010-10-03 15:13  sohu2000000  阅读(375)  评论(0编辑  收藏  举报

导航