pthread_barrier 系列函数在<pthread.h>中定义,用于多线程的同步,它包含三个函数:

--pthread_barrier_init()

--pthread_barrier_wait()

--pthread_barrier_destroy()

那么pthread_barrier_*是用来做什么的?这三个函数又怎么配合使用呢?

pthread_barrier_*其实只做且只能做一件事,就是充当栏杆(barrier意为栏杆)。形象的说就是把先后到达的多个线程挡在同一栏杆前,直到所有线程到齐,然后撤下栏杆同时放行。1)init函数负责指定要等待的线程个数;2) wait()函数由每个线程主动调用,它告诉栏杆“我到起跑线前了”。wait()执行末尾栏杆会检查是否所有人都到栏杆前了,如果是,栏杆就消失所有线程继续执行下一句代码;如果不是,则所有已到wait()的线程停在该函数不动,剩下没执行到wait()的线程继续执行;3)destroy函数释放init申请的资源。

1 使用场景举例:

这种“栏杆”机制最大的特点就是最后一个执行wait的动作最为重要,就像赛跑时的起跑枪一样,它来之前所有人都必须等着。所以实际使用中,pthread_barrier_*常常用来让所有线程等待“起跑枪”响起后再一起行动。比如我们可以用pthread_create() 生成100 个线程,每个子线程在被create出的瞬间就会自顾自的立刻进入回调函数运行。但我们可能不希望它们这样做,因为这时主进程还没准备好,和它们一起配合的其它线程还没准备好,我们希望它们在回调函数中申请完线程空间、初始化后停下来,一起等待主进程释放一个“开始”信号,然后所有线程再开始执行业务逻辑代码。

解决方案:

为了解决上述场景问题,我们可以在init时指定n+1个等待,其中n是线程数。而在每个线程执行函数的首部调用wait()。这样100个pthread_create()结束后所有线程都停下来等待最后一个wait()函数被调用。这个wait()由主进程在它觉得合适的时候调用就好。最后这个wait()就是鸣响的起跑枪。

2 函数原型:

#include <pthread.h>

int pthread_barrier_init(pthread_barrier_t *restrict barrier, const pthread_barrierattr_t *restrict attr, unsigned count);

int pthread_barrier_wait(pthread_barrier_t *barrier);

int pthread_barrier_destroy(pthread_barrier_t *barrier);

参数解释:

pthread_barrier_t,是一个计数锁,对该锁的操作都包含在三个函数内部,我们不用关心也无法直接操作。只需要实例化一个对象丢给它就好。

pthread_barrierattr_t,锁的属性设置,设为NULL让函数使用默认属性即可。

count,你要指定的等待个数。

3 程序举例:

#include <pthread.h>

class thisclass{

private:

static void* doSomething(void* arg)

{

thisclass* pInstance = (thisclass*) arg;

pthread_barrier_wait(pInstance->barrier);//所有线程都被阻塞在这里

//下面是线程具体要做的事

//...

}

protected:

pthread_barrier_t barrier;

int thread_num; // = 100;

pthread_t* thread;

public:

int init(){ //生成100个等待的线程

int ret = -1;

pthread_attr_t attr;

pthread_attr_init(&attr);

do{

if(thread_num == 0

|| (thread = (pthread_t*)malloc(thread_num *sizeof(pthread_t))) == NULL)

break;

pthread_barrier_init(&barrier,NULL, thread_num + 1); //100+1个等待

for(i=0; i<thread_num; i++)

if(pthread_create(thread+i, &attr, doSomething, this))

break; //100个create成功的线程都进入上面的doSomething函数执行

if(i!= thread_num)

break;

ret= 0;

}while(false)

return ret;

}

int activate(){ //等一切都安排好了调用该函数。起跑枪“砰!”

pthread_barrier_wait(barrier);

return0;

}

}

4 三个函数的英文说明见这里,里面有更细节的语法介绍:

http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_barrier_wait.html

http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_barrier_init.html

最新文章

  1. MVC中使用Action全局过滤器出现:网页无法正常运作 将您重定向的次数过多。解决办法
  2. 关于javascript闭包中的this对象
  3. XML基础学习02&lt;linq to xml&gt;
  4. SOA (面向服务的体系结构)
  5. php date函数 参数详细
  6. 论文笔记之:Decoupled Deep Neural Network for Semi-supervised Semantic Segmentation
  7. BZOJ 2351 Matrix(哈希)
  8. PAT (Advanced Level) 1071. Speech Patterns (25)
  9. 【转】asp.net Core 系列【一】——创建Web应用
  10. 手把手JDK环境变量配置
  11. maven win 安装 与 IntelliJ IDEA 配置Maven【2018-11-14最新最有姿势攻略】
  12. 开始Flask项目
  13. 2、初探 ZooKeeper 技术内幕
  14. db2报错信息
  15. CNN网络架构演进
  16. 3、modleForm组件
  17. hbase实战——(1.1 nosql介绍)
  18. tp5中nginx配置
  19. 前端开发之CSS篇三
  20. LightOJ 1326 – Race 第二类Stirling数/

热门文章

  1. hdu 5427 A problem of sorting
  2. JavaScript高级程序设计之原型对象
  3. HTTP网页错误代码大全带解释
  4. 戏说PHP的嵌套函数
  5. 转:CentOS 7 安装Nginx
  6. [转]p2p端口映射工具 dog-tunnel
  7. mini2440 linuxi2c驱动
  8. unity工具IGamesTools之批量生成帧动画
  9. PBOC2.0与PBOC3.0的区别
  10. 第一个完整的cppunit单元测试程序