千家信息网

如何分析基于linux threads-2.3的线程屏障

发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章给大家介绍如何分析基于linux threads-2.3的线程屏障,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。线程屏障是线程同步的一个方式。线程执行完一个操作后,可能需
千家信息网最后更新 2025年02月06日如何分析基于linux threads-2.3的线程屏障

这篇文章给大家介绍如何分析基于linux threads-2.3的线程屏障,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

线程屏障是线程同步的一个方式。线程执行完一个操作后,可能需要等待其他线程也完成某个动作,这时候,当前该线程就会被挂起,直到其他线程也完成了某个操作,最后所有线程被唤醒。屏障主要有三个函数。

intpthread_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 don't bother dealing with cancellation because the POSIX spec for barriers doesn't 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;}
intpthread_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;}
intpthread_barrier_destroy(pthread_barrier_t *barrier){ // 有线程在等待 if (barrier->__ba_waiting != NULL) return EBUSY; return 0;}

从代码里我们知道,屏障的本质就是计数,还没有达到某个数的时候,当前线程就被阻塞,等到最后一个线程执行pthread_barrier_wait函数并且得到了某个数的时候,全部线程被唤醒。

关于如何分析基于linux threads-2.3的线程屏障就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

线程 屏障 次数 队列 阻塞 分析 内容 函数 时候 更多 帮助 不错 三个 不够 代码 兴趣 动作 字段 小伙 小伙伴 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 国外关于网络技术的app h3c服务器怎么扩展磁盘 网络安全法 宣传画 青藤公司网络安全 文化资源基础数据库 网络安全工作人员等级 邢台市网络安全培训 广联达软件开发有技术含量吗 软件开发人员驻场机构 社交软件开发需要什么资质 软件开发培训出来怎么样 黑龙江安防时钟监控网管服务器 国大互联网教育科技有限公司收入怎么样 网络安全的论文 我的世界从零开始制作服务器合集 linux怎么登录数据库 怎么关闭本机端口网络安全 交易数据库与网络系统 录像机显示无法连接到服务器 网络安全管理重要意义 网络安全密钥破解软件 nba2kol2客户端与服务器连接失败 拒绝网络安全诈骗的手抄报 网络安全渗透测试工作规范 社交软件开发需要什么资质 斯坦福大学线上网络安全硕士 如何利用数据库查询本校科研成果 黑龙江安防时钟监控网管服务器 中控考勤机数据库软件 30岁做软件开发 北京
0