线程屏障是线程同步的一种方式. 线程执行操作后,可能需要等待其他线程完成操作. 这时,当前线程将被挂起,直到另一个线程也完成一个操作,最后所有线程都被唤醒. 屏障具有三个主要功能.

int

pthread_barrier_wait(pthread_barrier_t *barrier)

{

pthread_descr self = thread_self();

pthread_descr temp_wake_queue, th;

int result = 0;

__pthread_lock(&barrier->__ba_lock, self);

/* If the required number of threads have achieved rendezvous... */

// pthread_barrier_wait被调用的次数达到阈值,__ba_present + 1 == __ba_required

if (barrier->__ba_present >= barrier->__ba_required - 1)

{

/* ... then this last caller shall be the serial thread */

result = PTHREAD_BARRIER_SERIAL_THREAD;

/* Copy and clear wait queue and reset barrier. */

// 被阻塞的线程队列

temp_wake_queue = barrier->__ba_waiting;

// 重置字段

barrier->__ba_waiting = NULL;

barrier->__ba_present = 0;

}

else

{

result = 0;

// 执行pthread_barrier_wait一次,加一

barrier->__ba_present++;

// 插入等待队列

enqueue(&barrier->__ba_waiting, self);

}

__pthread_unlock(&barrier->__ba_lock);

// 调用pthread_barrier_wait的次数还不够

if (result == 0)

{

/* Non-serial threads have to suspend */

// 挂起当前线程

suspend(self);

/* We dont bother dealing with cancellation because the POSIX

spec for barriers doesnt mention that pthread_barrier_wait

is a cancellation point. */

}

else

{

/* Serial thread wakes up all others. */

// 唤醒其他的线程

while ((th = dequeue(&temp_wake_queue)) != NULL)

restart(th);

}

return result;

}

int

pthread_barrier_init(pthread_barrier_t *barrier,

const pthread_barrierattr_t *attr,

unsigned int count)

{

if (count == 0)

return EINVAL;

__pthread_init_lock(&barrier->__ba_lock);

// 需要执行pthread_barrier_wait的次数

barrier->__ba_required = count;

// 已经调用pthread_barrier_wait的次数

barrier->__ba_present = 0;

// 调用pthread_barrier_wait被阻塞的线程队列

barrier->__ba_waiting = NULL;

return 0;

}

int

pthread_barrier_destroy(pthread_barrier_t *barrier)

{

// 有线程在等待

if (barrier->__ba_waiting != NULL) return EBUSY;

return 0;

}

从代码中我们知道,障碍的本质是计数. 当尚未达到一定数量时pthread 线程挂起,当前线程被阻止. 当最后一个线程执行pthread_barrier_wait函数并获得一定数目时pthread 线程挂起,所有线程都被唤醒.

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-210690-1.html

Linux线程屏障,线程屏障(基于linuxthreads-2.3)相关推荐

  1. linux线程同步(5)-屏障

    一.概述                                                    barrier(屏障)与互斥量,读写锁,自旋锁不同,它不是用来保护临界区的.相反,它跟条 ...

  2. 【C++学习】 基于Linux/C++简单线程池的实现

    [C++学习] 基于Linux/C++简单线程池的实现 转载自:https://www.cnblogs.com/alwayswangzi/p/7138154.html 我们知道Java语言对于多线程的 ...

  3. 一文搞定Linux进程和线程(详细图解)

    Linux 进程和线程 本篇文章我们就深入理解一下 Linux 内核来理解 Linux 的基本概念之进程和线程.系统调用是操作系统本身的接口,它对于创建进程和线程,内存分配,共享文件和 I/O 来说都 ...

  4. Linux C编程--线程操作1--线程概述和简单的线程操作

    关于linux线程 在许多经典的操作系统教科书中, 总是把进程定义为程序的执行实例, 它并不执行什么, 只是维护应用程序所需的各种资源. 而线程则是真正的执行实体.  为了让进程完成一定的工作, 进程 ...

  5. linux 线程--内核线程、用户线程实现方法

    Linux上进程分3种,内核线程(或者叫核心进程).用户进程.用户线程 内核线程拥有 进程描述符.PID.进程正文段.核心堆栈 当和用户进程拥有相同的static_prio 时,内核线程有机会得到更多 ...

  6. 一文搞定Linux环境下线程编程,这些东西老师也不会教你。(史上最详细的线程攻略)

    一.线程的概念 1.1 什么是线程 线程是一个实体,是CPU调度和分派的基本单元,有时我们也可以称它为轻量级的进程.每个线程都包含有表示执行环境所必须的信息,其中包括标识线程 的线程ID.一组寄存器值 ...

  7. Linux进程、线程模型,LWP,pthread_self()

    一.定义 关于进程.轻量级进程.线程.用户线程.内核线程的定义,这个很容易找到,但是看完之后你可以说你懂了,但实际上你真的明白了么? 在现代操作系统中,进程支持多线程.进程是资源管理的最小单元:而线程 ...

  8. Linux RCU机制+内存屏障

    Linux RCU机制+内存屏障 1. RCU 1.1 RCU 背景(读写锁的问题) 1.1.1 读写锁(写独占,读共享,写锁优先级高) 1.1.2 读写锁的缺点(写独占时不可读) 1.1.3 RCU ...

  9. linux thread model . Linux上posix线程库实现原理讨论

    http://blog.csdn.net/fanbird2008/article/details/6752853 Linux上posix线程库实现原理讨论 说明一下,这个问题困扰我好长时间,因为正如使 ...

  10. Linux进程与线程的区别 详细总结(面试经验总结)

    首先,简要了解一下进程和线程.对于操作系统而言,进程是核心之核心,整个现代操作系统的根本,就是以进程为单位在执行任务.系统的管理架构也是基于进程层面的.在按下电源键之后,计算机就开始了复杂的启动过程, ...

最新文章

  1. 三十之惑–面霸的八月(第二部分)
  2. 解决端口 windows10 端口被占用的问题
  3. java两个有序数组的初始化_leecode:88–合并两个有序数组 | 星尘
  4. Spring常见注解
  5. Matlab中基本统计量的函数
  6. Angular getOrCreateInjectable的实现原理调试
  7. 程序员过关斩将--领导说我的类的职责不单一
  8. 16张扎心漫画,戳中女生私密日常,每一幕都很真实
  9. python三角函数拟合_使用python进行数据拟合最小化函数
  10. c语言经典游戏,C语言——经典小游戏——打砖块
  11. sql azure 语法_在Azure中使用SQL Server 2016 CTP3
  12. oracle exp(dmp)命令带过滤条件?
  13. 苹果开场铃声 android,为何苹果用户喜欢用手机默认铃声?原因在这4点,真是非常现实...
  14. 台式机和计算机有什么区别,笔记本电脑和台式电脑有什么区别
  15. u盘克隆服务器系统,只需4步!简单又快速的克隆U盘
  16. Unacceptable certificate: CN=GlobalSign Domain Validation CA - SHA256 - G2, O=GlobalSign nv-sa, C=BE
  17. 华为研究院高级研究员几年心得终得趣谈网络协议文档,附资深架构师讲解
  18. 数学建模题目之在线教学的分析与研究
  19. 低代码对比分析,从工程化上看产品的优劣
  20. Tita OKR分享:如何进行OKR的复盘?

热门文章

  1. SpringCloud 实战:禁止直接访问后端服务
  2. 2020 年 Go 语言盘点:Go 的前进步伐不可阻挡
  3. 树莓派竟出微控制器了!Raspberry Pi Pico 只需 4 美元!
  4. 教你用 Android 做二次开发,识别率达到科大讯飞语音输入水平 | 原力计划
  5. 移动电话之父第一个电话打给对手,起底现代移动通信崛起之路!
  6. 中国开发者真实画像:Java长盛,偏爱Windows操作系统,鲜少参与开源项目
  7. 想从远程办公进入 toB 蓝海?它可以,你未必
  8. 3 天开发物联网应用!腾讯云 IoT 超级小程序来了
  9. SQL 已死,NoSQL 才是王道?|原力计划
  10. 从“谈芯”走向“用芯” RISC-V 未来前景光明?