网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月24日漏签0天
c++吧 关注:625,638贴子:2,112,579
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 下一页 尾页
  • 17回复贴,共2页
  • ,跳到 页  
<<返回c++吧
>0< 加载中...

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

  • 只看楼主
  • 收藏

  • 回复
  • sohu2000000
  • ||
    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   8 #define ROWS 10000 9 #define COLS 1000010 #define THREADS 1011 12 double initial_matrix[ROWS][COLS];13 double final_matrix[ROWS][COLS];14 // Barrier variable15 pthread_barrier_t barr;16 17 extern void DotProduct(int row, int col,18                         double source[ROWS][COLS],19                         double destination[ROWS][COLS]);20 extern double determinant(double matrix[ROWS][COLS]);21 22 void * entry_point(void *arg)23 {24      int rank = (int)arg;25      for(int 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 point30      int rc = pthread_barrier_wait(&barr);31      if(rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD)32      {33          printf("Could not wait on barrier\n");34          exit(-1);35      }36 37      for(int row = rank * ROWS / THREADS; row < (rank + 1) * THREADS; ++row)38          for(int col = 0; col < COLS; ++col)39              DotProduct(row, col, final_matrix, initial_matrix);40 }41 42 int main(int argc, char **argv)43 {44      pthread_t thr[THREADS];45 46      // Barrier initialization47      if(pthread_barrier_init(&barr, NULL, THREADS))48      {49          printf("Could not create a barrier\n");50          return -1;51      }52      53      for(int i = 0; i < THREADS; ++i)54      {55          if(pthread_create(&thr[i], NULL, &entry_point, (void*)i))56          {57              printf("Could not create thread %d\n", i);58              return -1;59          }60      }61 62      for(int i = 0; i < THREADS; ++i)63      {64          if(pthread_join(thr[i], NULL))65          {66              printf("Could not join thread %d\n", i);67              return -1;68          }69      }70 71      double det = Determinant(initial_matrix);72      printf("The determinant of M^4 = %f\n", det);73 74      return 0;75 }
这段程序产生出许多个线程,并且分配给每个线程计算矩阵乘法的一部分,然后每个线程使用这次计算的结果,继续进行下一步的计算:另一个矩阵的乘法
几点关于API的说明:
barrier 变量必须在最开始声名为全局变量
barrier 变量的初始化必须在main函数里进行初始化
在点上每一个线程都会等待它的对端完成工作
注意
在程序顶部的宏定义 _XOPEN_SOURCE 是非常重要的;如果没有这个变量,那么barrier类型就会在pthread.h中被屏蔽掉,这个定义必须在所有的头文件引用之前被定义出来
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2010/10/02/5***801.aspx



  • sohu2000000
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
晕倒,代码走形了,重新帖一遍
#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;
        
}



2025-07-24 12:31:25
广告
不感兴趣
开通SVIP免广告
  • 杰物
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
lz啊,这贴应该发到linux吧去


  • 沙河畔电子科大
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
什么教程第5课就讲这些?大跃进啊?


  • sohu2000000
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
站在巨人的肩膀上胡思乱想吧



  • sohu2000000
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:3楼
站在巨人的肩膀上胡思乱想吧


  • sohu2000000
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:2楼
     兄弟,这是纯语言滴东东 :)


  • 幻の上帝
  • ->*
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:7楼
进程的概念就不是纯语言范畴的。


2025-07-24 12:25:25
广告
不感兴趣
开通SVIP免广告
  • 沙河畔电子科大
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
"信号量"是“纯语言的东东”?


  • 杰物
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
- 9
貌似是……C标准库里有signal.h这个文件……


  • 沙河畔电子科大
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
标准库是纯语言的东西吗?


  • 沙河畔电子科大
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:5楼
你想说谁是巨人?


  • sohu2000000
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:12楼
PTHREAD 对 课本级别C编程是巨人


  • sohu2000000
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:8楼
     应该算是unix初级编程的范畴


2025-07-24 12:19:25
广告
不感兴趣
开通SVIP免广告
  • sohu2000000
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:9楼
      因为这个算不上是什么高深的东西,或者说是不同代码员之间的技术断裂点,几乎所有的代码员都应该熟的不能再熟了,所以算是基本的编程技能


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 17回复贴,共2页
  • ,跳到 页  
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示