Linux线程屏障,线程屏障(基于linuxthreads-2.3)
线程屏障是线程同步的一种方式. 线程执行操作后,可能需要等待其他线程完成操作. 这时,当前线程将被挂起,直到另一个线程也完成一个操作,最后所有线程都被唤醒. 屏障具有三个主要功能.
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)相关推荐
- linux线程同步(5)-屏障
一.概述 barrier(屏障)与互斥量,读写锁,自旋锁不同,它不是用来保护临界区的.相反,它跟条 ...
- 【C++学习】 基于Linux/C++简单线程池的实现
[C++学习] 基于Linux/C++简单线程池的实现 转载自:https://www.cnblogs.com/alwayswangzi/p/7138154.html 我们知道Java语言对于多线程的 ...
- 一文搞定Linux进程和线程(详细图解)
Linux 进程和线程 本篇文章我们就深入理解一下 Linux 内核来理解 Linux 的基本概念之进程和线程.系统调用是操作系统本身的接口,它对于创建进程和线程,内存分配,共享文件和 I/O 来说都 ...
- Linux C编程--线程操作1--线程概述和简单的线程操作
关于linux线程 在许多经典的操作系统教科书中, 总是把进程定义为程序的执行实例, 它并不执行什么, 只是维护应用程序所需的各种资源. 而线程则是真正的执行实体. 为了让进程完成一定的工作, 进程 ...
- linux 线程--内核线程、用户线程实现方法
Linux上进程分3种,内核线程(或者叫核心进程).用户进程.用户线程 内核线程拥有 进程描述符.PID.进程正文段.核心堆栈 当和用户进程拥有相同的static_prio 时,内核线程有机会得到更多 ...
- 一文搞定Linux环境下线程编程,这些东西老师也不会教你。(史上最详细的线程攻略)
一.线程的概念 1.1 什么是线程 线程是一个实体,是CPU调度和分派的基本单元,有时我们也可以称它为轻量级的进程.每个线程都包含有表示执行环境所必须的信息,其中包括标识线程 的线程ID.一组寄存器值 ...
- Linux进程、线程模型,LWP,pthread_self()
一.定义 关于进程.轻量级进程.线程.用户线程.内核线程的定义,这个很容易找到,但是看完之后你可以说你懂了,但实际上你真的明白了么? 在现代操作系统中,进程支持多线程.进程是资源管理的最小单元:而线程 ...
- Linux RCU机制+内存屏障
Linux RCU机制+内存屏障 1. RCU 1.1 RCU 背景(读写锁的问题) 1.1.1 读写锁(写独占,读共享,写锁优先级高) 1.1.2 读写锁的缺点(写独占时不可读) 1.1.3 RCU ...
- linux thread model . Linux上posix线程库实现原理讨论
http://blog.csdn.net/fanbird2008/article/details/6752853 Linux上posix线程库实现原理讨论 说明一下,这个问题困扰我好长时间,因为正如使 ...
- Linux进程与线程的区别 详细总结(面试经验总结)
首先,简要了解一下进程和线程.对于操作系统而言,进程是核心之核心,整个现代操作系统的根本,就是以进程为单位在执行任务.系统的管理架构也是基于进程层面的.在按下电源键之后,计算机就开始了复杂的启动过程, ...
最新文章
- 三十之惑–面霸的八月(第二部分)
- 解决端口 windows10 端口被占用的问题
- java两个有序数组的初始化_leecode:88–合并两个有序数组 | 星尘
- Spring常见注解
- Matlab中基本统计量的函数
- Angular getOrCreateInjectable的实现原理调试
- 程序员过关斩将--领导说我的类的职责不单一
- 16张扎心漫画,戳中女生私密日常,每一幕都很真实
- python三角函数拟合_使用python进行数据拟合最小化函数
- c语言经典游戏,C语言——经典小游戏——打砖块
- sql azure 语法_在Azure中使用SQL Server 2016 CTP3
- oracle exp(dmp)命令带过滤条件?
- 苹果开场铃声 android,为何苹果用户喜欢用手机默认铃声?原因在这4点,真是非常现实...
- 台式机和计算机有什么区别,笔记本电脑和台式电脑有什么区别
- u盘克隆服务器系统,只需4步!简单又快速的克隆U盘
- Unacceptable certificate: CN=GlobalSign Domain Validation CA - SHA256 - G2, O=GlobalSign nv-sa, C=BE
- 华为研究院高级研究员几年心得终得趣谈网络协议文档,附资深架构师讲解
- 数学建模题目之在线教学的分析与研究
- 低代码对比分析,从工程化上看产品的优劣
- Tita OKR分享:如何进行OKR的复盘?
热门文章
- SpringCloud 实战:禁止直接访问后端服务
- 2020 年 Go 语言盘点:Go 的前进步伐不可阻挡
- 树莓派竟出微控制器了!Raspberry Pi Pico 只需 4 美元!
- 教你用 Android 做二次开发,识别率达到科大讯飞语音输入水平 | 原力计划
- 移动电话之父第一个电话打给对手,起底现代移动通信崛起之路!
- 中国开发者真实画像:Java长盛,偏爱Windows操作系统,鲜少参与开源项目
- 想从远程办公进入 toB 蓝海?它可以,你未必
- 3 天开发物联网应用!腾讯云 IoT 超级小程序来了
- SQL 已死,NoSQL 才是王道?|原力计划
- 从“谈芯”走向“用芯” RISC-V 未来前景光明?