随笔 - 154  文章 - 0  评论 - 1  阅读 - 12万

线程学习六:pthread使用barrier栅栏方式同步

Linux中提供了多种同步机制,其中使用barrier(栅栏)是多线程之间进行同步的方法之一。

基本原理:

假设多个线程约定一个栅栏,只有当所有的线程都达到这个栅栏时,栅栏才会放行,否则到达此处的线程将被阻塞。

使用场景:

程序启动的时候,需要建立一个独立的线程去做一些特殊的工作。比如这个线程需要初始化一些全局配置等等。而主线程启动后,必须等待这个子线程拿到配置信息后,才能继续工作。

所以这里就存在一个问题要解决,主线程如何等待这个子线程完成工作后,才继续往下执行呢?

栅栏相关API

#include <pthread.h>

// 初始化栅栏,栅栏需要等待到count个线程,才会全部一起放行。
int pthread_barrier_init(pthread_barrier_t *restrict,
                         const pthread_barrierattr_t *restrict, unsigned count);
// 报道函数,当一个线程到达栅栏的时候,就报道。
// 所有的线程都报道后,栅栏自然会放行。
int pthread_barrier_wait(pthread_barrier_t *barrier);

// 栅栏完成历史使命后,当然是功成身退。
int pthread_barrier_destroy(pthread_barrier_t *barrier);
pthread_barrier_*其实只做且只能做一件事,就是充当栏杆(barrier意为栏杆)。形象的说就是把先后到达的多个线程挡在同一栏杆前,直到所有线程到齐,然后撤下栏杆同时放行。

1)init函数负责指定要等待的线程个数;

2) wait()函数由每个线程主动调用,它告诉栏杆“我到起跑线前了”。wait()执行末尾栏杆会检查是否所有人都到栏杆前了,如果是,栏杆就消失所有线程继续执行下一句代码;如果不是,则所有已到wait()的线程停在该函数不动,剩下没执行到wait()的线程继续执行;

3)destroy函数释放init申请的资源。

使用示例

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
pthread_barrier_t barrier;

void* initor(void* args)
{
    printf("---------------thread init work(%d)--------------\n", time(NULL));
    // 模拟初始化工作。
    sleep(10);
    // 到达栅栏
    pthread_barrier_wait(&barrier);
    printf("--------------thread start work(%d)--------------\n", time(NULL));
    sleep(10);
    printf("--------------thread stop work(%d)--------------\n", time(NULL));
    return NULL;
}
int main(int argc, char* argv[])
{
    // 初始化栅栏,该栅栏等待两个线程到达时放行
    pthread_barrier_init(&barrier, NULL, 2);
    printf("**************main thread barrier init done****************\n");
    pthread_t pid;
    pthread_create(&pid, NULL, &initor, NULL);
    printf("**************main waiting(%d)********************\n", time(NULL));
    // 主线程到达,被阻塞,当初始化子线程到达栅栏时才放行。
    pthread_barrier_wait(&barrier);
    pthread_barrier_destroy(&barrier);
    printf("***************main start to work(%d)****************\n", time(NULL));
    sleep(30);
    pthread_join(pid, NULL);
    printf("***************thread complete(%d)***************\n", time(NULL));
    return 0;
}

/* 结果:
**************main thread barrier init done****************
**************main waiting(1646375216)********************
---------------thread init work(1646375216)--------------
--------------thread start work(1646375226)--------------
***************main start to work(1646375226)****************
--------------thread stop work(1646375236)--------------
***************thread complete(1646375256)***************
*/

以上来自于
https://langzi989.github.io/2018/07/05/pthread使用barrier栅栏方式同步/
https://www.cnblogs.com/liyulong1982/p/5480678.html

posted on   JJ_S  阅读(1196)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示