0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用pthread_barrier_xxx系列函数来实现多线程之间的同步?

嵌入式那些事 来源:嵌入式那些事 2023-10-23 14:43 次阅读

Linux系统中提供了多种同步机制,本文主要讲讲如何使用pthread_barrier_xxx系列函数来实现多线程之间进行同步的方法。

函数定义

pthread_barrier_xxx系列函数中的barrier可意为栅栏,可以理解为该栅栏能够把先后到达的多个线程阻挡在同一栅栏前,直到所有线程到齐,栅栏才会放行,否则到达此处的线程将被阻塞。

pthread_barrier_xxx系列函数在文件中定义,用于多线程的同步,该系列函数主要包含下列三个函数:

//初始化栅栏,负责指定栅栏要等待的线程个数,
//栅栏需要等待count个线程都到达栅栏时,才会全部一起放行
intpthread_barrier_init(pthread_barrier_t*restrict,
constpthread_barrierattr_t*restrict,unsignedcount);

//pthread_barrier_wait()函数会同步所有参与barrier的线程,
//调用该函数的线程会阻塞住,直到pthread_barrier_init()中指定
//数量的线程调用了pthread_barrier_wait()函数,所有线程才会同时往下执行
intpthread_barrier_wait(pthread_barrier_t*barrier);

//释放pthread_barrier_init()函数申请的资源
intpthread_barrier_destroy(pthread_barrier_t*barrier);

应用场景

在应用程序启动的时候,需要创建一个或者多个线程去完成不同功能的处理。子线程启动之后,需要等待主进程完成基础的配置之后各个子线程才能正常工作。所以这里就存在一个问题要解决,各个子线程如何等待主进程完成工作后,才继续往下执行呢?

为了解决上述场景的问题,我们可以在调用pthread_barrier_init()时指定n+1个等待,其中n是线程数。而在每个线程执行函数的开始调用pthread_barrier_wait()。这样主进程在调用pthread_create()创建子线程后,子线程运行到pthread_barrier_wait()后将被阻塞,线程都停下来等待最后一个pthread_barrier_wait()函数被调用。最后一个pthread_barrier_wait()函数由主进程或者其他子线程在它觉得合适的时候调用就行。最后这个pthread_barrier_wait()有点像跑步运动时的起步枪,只有最后这个pthread_barrier_wait()函数被调用,其他被阻塞的线程就能够继续运行。

使用实例

下面的程序,在main()函数中,pthread_barrier_init()指定2+1个等待,接着创建了2个线程,然后主进程延时6秒,之后调用pthread_barrier_wait()来让线程接着运行,程序如下:

/*
********************************************************************************
*描述:pthread_barrier_xxx程序示例
*Use:gccpthread_barrier_xxx.c-lpthread
*./a.out
*By:AilsonJack
*Date:2016.03.24
*CSDN//blog.csdn.net/jackailson
********************************************************************************
*/

#include
#include
#include
#include

//线程栅栏
pthread_barrier_tbarrier;

void*task1(void*arg);
void*task2(void*arg);

intmain(void)
{
pthread_ttask1_tid;
pthread_ttask2_tid;
pthread_attr_ttask1_attr;
pthread_attr_ttask2_attr;

//初始化线程属性
pthread_attr_init(&task1_attr);
pthread_attr_init(&task2_attr);

//初始化栅栏
pthread_barrier_init(&barrier,NULL,2+1);//2+1个等待

//创建线程1
pthread_create(&task1_tid,&task1_attr,task1,NULL);

//创建线程2
pthread_create(&task2_tid,&task2_attr,task2,NULL);

printf("mainprocesswillsleep6s.
");
sleep(6);//等待6s,让task1和task2都阻塞住了,再运行主线程

//主线程调用pthread_barrier_wait()函数之后,已经达到了
//pthread_barrier_init()函数设置的3个等待条件,此时调用
//pthread_barrier_wait()函数的主线程不会被阻塞,task1和
//task2也将继续运行.
pthread_barrier_wait(&barrier);

pthread_join(task1_tid,NULL);
pthread_join(task2_tid,NULL);
pthread_barrier_destroy(&barrier);
}

void*task1(void*arg)
{
printf("task1willbeblocked.
");
pthread_barrier_wait(&barrier);//线程将被阻塞在这里
printf("task1isrunning.
");
sleep(3);//延时3s
pthread_exit(NULL);
}

void*task2(void*arg)
{
printf("task2willbeblocked.
");
pthread_barrier_wait(&barrier);//线程将被阻塞在这里
printf("task2isrunning.
");
sleep(3);//延时3s
pthread_exit(NULL);
}

程序的运行结果如下图所示:

3dd9dff2-716e-11ee-939d-92fbcf53809c.png







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux系统
    +关注

    关注

    4

    文章

    567

    浏览量

    26911
  • 多线程
    +关注

    关注

    0

    文章

    271

    浏览量

    19724

原文标题:Linux应用编程-pthread_barrier_xxx介绍

文章出处:【微信号:嵌入式那些事,微信公众号:嵌入式那些事】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    多线程程之一: 问题提出

    进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C++ 6.0中,使用MFC类库也实现多线程的程序设计,使得
    发表于 10-22 11:41

    多线程程之线程同步

    多线程程之线程同步八、线程同步  虽然多线程
    发表于 10-22 11:43

    浅谈基于Linux操作系统中多线程同步原理及应用

    。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线程间的同步。  条件变量的结构为pthread_cond_t,函数
    发表于 02-02 14:49

    线程的分离状态 pthread

    pthread_create函数返回之前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用,这样调用pthread_crea
    发表于 09-26 09:36

    Linux下多线程机制

    1 线程不能独立运行,要依附于进程2 如果创建一个子线程只需要重新分配栈空间3 多个线程可以并行运行4 线程之间可以有共同的全局变量(全局区,任何线
    发表于 11-11 09:53

    Linux下多线程机制

    1 线程不能独立运行,要依附于进程  2 如果创建一个子线程只需要重新分配栈空间  3 多个线程可以并行运行  4 线程之间可以有共同的全局变量(全局区, 任何
    发表于 01-10 14:59

    LABVIEW如何使用ICMP协议实现多线程ping的功能

    LABVIEW如何通过ICMP协议实现多线程ping的功能?这个网上没查到相关资料。通过cmd同时ping线程之间会影响效率。这个如何解决呢?求大家指点,感谢!
    发表于 11-16 17:31

    Linux多线程线程同步

    ,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。3、线程
    发表于 12-08 14:14

    linux多线程常用相关函数简介

    释放,但是可以用pthread_join()函数来同步并释放资源。 说明:retval:pthread_exit()调用线程的返回值,可由其
    发表于 06-27 08:36

    多线程解决思路一

    使用方法节点实现多线程,两个线程之间的数据传输也都使用方法节点的方式实现。1、初始化时打开另一个线程。2、程序运行过程中
    发表于 07-06 17:21

    多线程程之Linux线程编程

    的可移植性。 (1)函数说明。 创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数pth
    发表于 10-18 15:55 3次下载

    mfc多线程编程实例及代码,mfc多线程间通信介绍

    摘要:本文主要以MFC多线程为中心,分别对MFC多线程的实例、MFC多线程之间的通信展开的一系列研究,下面我们来看看原文。
    发表于 12-08 15:23 1.7w次阅读
    mfc<b class='flag-5'>多线程</b>编程实例及代码,mfc<b class='flag-5'>多线程</b>间通信介绍

    linux多线程机制-线程同步

    ,而且可以在不同应用程序的线程之间实现对资源的安全共享。Linux中通过pthread_mutex_t来定义互斥体机制完成互斥操作。具体的操作函数如下  
    发表于 04-02 14:42 340次阅读

    PyQT5+OpenCV多线程协作演示

    学习多线程最典型的问题就是如何在多个线程之间传递消息与写作,PyQT5的线程支持在不同线程之间传递信号触发事件,实现多个
    的头像 发表于 03-08 14:58 840次阅读

    多线程如何保证数据的同步

    多线程编程是一种并发编程的方法,意味着程序中同时运行多个线程,每个线程可独立执行不同的任务,共享同一份数据。由于多线程并发执行的特点,会引发数据同步
    的头像 发表于 11-17 14:22 349次阅读