亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標題:
【原創(chuàng)】跟劉峰六學C語言(5) 線程柵欄
[打印本頁]
作者:
sohu2000000
時間:
2010-10-02 16:56
標題:
【原創(chuàng)】跟劉峰六學C語言(5) 線程柵欄
某些并行計算需要面臨某些在計算進行前的某些單通瓶頸點,這種情況下,當然可以使用信號量的方式來進行處理,但是還存在著另外的一種處理方式是更加方便的,它就是:柵欄(在pthread庫里面被定義成為類型 pthread_barrier_t),下面我們來看一段程序作為示例
#define _XOPEN_SOURCE 600
#include <pthread.h>
#include <stdlib,h>
#include <stdio.h>
#define ROWS 10000
#define COLS 10000
#define THREADS 10
double initial_matrix[ROWS][COLS];
double final_matrix[ROWS][COLS];
//Barrier variable
pthread_barrier_t barr
extern void DotProduct(int row, int col, double source[ROWS][COLS], double destination[ROWS][COLS]);
extern void determinant(double matrix[ROWS][COLS]);
void * entry_point(void * arg)
{
int rank = (int)arg;
int row;
for(row=rank*ROWS/THREADS; row < (rank+1)*THREADS;++row)
for(int col=0;col<COLS;++col)
DotProduct(row,col,initial_matrix,final_matrix);
//synchronization pointer
int rc = pthread_barrier_wait(&barr);
if(rc!=0 && rc != PTHREAD_BARRIER_SERIAL_THREAD)
{
printf("Could not wait on barrier\n");
exit(-1);
}
for(row=rank*ROWS/THREADS; row < (rank+1)*THREADS;++row)
for(int col=0;col<COLS;++col)
DotProduct(row,col,final_matrix,initial_matrix);
}
int main(int argc, char* argv[])
{
int i;
pthread_t thr[THREADS];
//Barrier initialization
if(pthread_barrierattr_init(&barr,NULL,THREADS))
{
printf("Could not create a barrier\n");
return -1;
}
for(i=0;i<THREADS;++i)
{
if(pthread_create(&thr[i],NULL,&entry_point, (void*)i))
{
printf("Could not create thread %d\n", i);
return -1;
}
}
for(i=0;i<THREADS;++i)
{
if(pthread_join(thr[i],NULL))
{
printf("Could not join thread %d\n", i);
return -1;
}
}
double det = determinant(initial_matrix);
printf("The determinant of M^4 = %f\n", det);
return 0;
}
復制代碼
這段程序產生出許多個線程,并且分配給每個線程計算矩陣乘法的一部分,然后每個線程使用這次計算的結果,繼續(xù)進行下一步的計算:另一個矩陣的乘法
幾點關于API的說明:
barrier 變量必須在最開始聲名為全局變量
barrier 變量的初始化必須在main函數(shù)里進行初始化
在點上每一個線程都會等待它的對端完成工作
注意
在程序頂部的宏定義 _XOPEN_SOURCE 是非常重要的;如果沒有這個變量,那么barrier類型就會在pthread.h中被屏蔽掉,這個定義必須在所有的頭文件引用之前被定義出來
作者:
sohu2000000
時間:
2010-10-02 16:58
歡迎光臨 Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2