亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問板塊 發(fā)新帖
查看: 1809 | 回復(fù): 1
打印 上一主題 下一主題

[C] 【原創(chuàng)】跟劉峰六學(xué)C語(yǔ)言(5) 線程?hào)艡?/a> [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-10-02 16:56 |只看該作者 |倒序?yàn)g覽
某些并行計(jì)算需要面臨某些在計(jì)算進(jìn)行前的某些單通瓶頸點(diǎn),這種情況下,當(dāng)然可以使用信號(hào)量的方式來進(jìn)行處理,但是還存在著另外的一種處理方式是更加方便的,它就是:柵欄(在pthread庫(kù)里面被定義成為類型 pthread_barrier_t),下面我們來看一段程序作為示例
  1. #define _XOPEN_SOURCE 600

  2. #include <pthread.h>
  3. #include <stdlib,h>
  4. #include <stdio.h>

  5. #define ROWS        10000
  6. #define COLS        10000
  7. #define THREADS        10

  8. double initial_matrix[ROWS][COLS];
  9. double final_matrix[ROWS][COLS];

  10. //Barrier variable

  11. pthread_barrier_t barr

  12. extern void DotProduct(int row, int col, double source[ROWS][COLS], double destination[ROWS][COLS]);
  13. extern void determinant(double matrix[ROWS][COLS]);

  14. void * entry_point(void * arg)
  15. {
  16.     int rank = (int)arg;
  17.     int row;
  18.     for(row=rank*ROWS/THREADS; row < (rank+1)*THREADS;++row)
  19.         for(int col=0;col<COLS;++col)
  20.             DotProduct(row,col,initial_matrix,final_matrix);

  21.     //synchronization pointer

  22.     int rc = pthread_barrier_wait(&barr);
  23.     if(rc!=0 && rc != PTHREAD_BARRIER_SERIAL_THREAD)
  24.     {        
  25.         printf("Could not wait on barrier\n");
  26.         exit(-1);
  27.     }

  28.     for(row=rank*ROWS/THREADS; row < (rank+1)*THREADS;++row)
  29.         for(int col=0;col<COLS;++col)
  30.             DotProduct(row,col,final_matrix,initial_matrix);
  31. }

  32. int main(int argc, char* argv[])
  33. {
  34.     int i;
  35.     pthread_t thr[THREADS];

  36.     //Barrier initialization

  37.     if(pthread_barrierattr_init(&barr,NULL,THREADS))
  38.     {
  39.         
  40.         printf("Could not create a barrier\n");
  41.         return -1;
  42.     }

  43.     for(i=0;i<THREADS;++i)
  44.     {
  45.         if(pthread_create(&thr[i],NULL,&entry_point, (void*)i))
  46.         {
  47.             
  48.             printf("Could not create thread %d\n", i);
  49.             return -1;
  50.         }
  51.     }

  52.     for(i=0;i<THREADS;++i)
  53.     {
  54.         if(pthread_join(thr[i],NULL))
  55.         {
  56.             
  57.             printf("Could not join thread %d\n", i);
  58.             return -1;
  59.         }
  60.     }

  61.     double det = determinant(initial_matrix);
  62.     printf("The determinant of M^4 = %f\n", det);

  63.     return 0;
  64.         
  65. }
復(fù)制代碼
這段程序產(chǎn)生出許多個(gè)線程,并且分配給每個(gè)線程計(jì)算矩陣乘法的一部分,然后每個(gè)線程使用這次計(jì)算的結(jié)果,繼續(xù)進(jìn)行下一步的計(jì)算:另一個(gè)矩陣的乘法

幾點(diǎn)關(guān)于API的說明:

barrier 變量必須在最開始聲名為全局變量
barrier 變量的初始化必須在main函數(shù)里進(jìn)行初始化
在點(diǎn)上每一個(gè)線程都會(huì)等待它的對(duì)端完成工作
注意
在程序頂部的宏定義 _XOPEN_SOURCE 是非常重要的;如果沒有這個(gè)變量,那么barrier類型就會(huì)在pthread.h中被屏蔽掉,這個(gè)定義必須在所有的頭文件引用之前被定義出來

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2010-10-02 16:58 |只看該作者
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP