Linux系统编程-(pthread)线程通信(围栏机制)

简介: Linux线程里还支持一个围栏机制--也就是屏障功能。这个围栏机制,可以设置等待的线程数量,当指定数量的线程都到齐之后再全部唤醒—放行。它的的功能和它的名字是匹配的,就是围栏,就像在赛跑比赛场上,要进行比赛时,必须等待所有运动员都到齐全了,都到起跑线上了,然后一声令下,大家再一起跑出去。

1. 围栏机制介绍

Linux线程里还支持一个围栏机制--也就是屏障功能。这个围栏机制,可以设置等待的线程数量,当指定数量的线程都到齐之后再全部唤醒—放行。它的的功能和它的名字是匹配的,就是围栏,就像在赛跑比赛场上,要进行比赛时,必须等待所有运动员都到齐全了,都到起跑线上了,然后一声令下,大家再一起跑出去。

在Linux线程里的屏障功能由pthread_barrier 系列函数实现,在<pthread.h>中定义,功能主要是用于多线程的同步。

2. 围栏机制相关的函数介绍

相关的函数接口如下:

#include <pthread.h>
1. 销毁围栏
int pthread_barrier_destroy(pthread_barrier_t *barrier);
参数:
 pthread_barrier_t*就是围栏机制的结构。

2. 初始化围栏
int pthread_barrier_init(pthread_barrier_t *restrict barrier,const pthread_barrierattr_t *restrict attr, unsigned count);
参数: unsigned count 表示需要等待的线程数量,必须有这么多线程都在等待了,栏杆才会放行。


3. 等待条件成立
int pthread_barrier_wait(pthread_barrier_t *barrier);
功能: 阻塞等待线程的数量到齐,这个数量在初始化的时候设置,全部成立了,再返回。

3. 围栏机制使用案例1

下面代码里设置栏杆等待线程数量为10个,然后启动循环创建10个线程,当10个线程创建完毕之后,一起运行。

设置线程为分离属性。

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

pthread_barrier_t barrier;

/*
线程工作函数
*/
void *thread_work_func(void *dev)
{
    int i=(int)dev;
    printf("第%d个线程等待运行...\n",i);

    //等待线程的数量
    pthread_barrier_wait(&barrier);
    
    printf("第%d个线程开始运行...\n",i);
}

int main(int argc,char **argv)
{   
    //初始化栏杆机制
    pthread_barrier_init(&barrier,NULL,10);

    /*创建子线程*/
    pthread_t thread_id;
    int i;
    for(i=0;i<10;i++)
    {
        if(pthread_create(&thread_id,NULL,thread_work_func,(void*)i)!=0)
        {
            printf("子线程%d创建失败.\n",i);
            return -1;
        }
        //设置线程的分离属性
        pthread_detach(thread_id);
        sleep(1);
    }
    pause(); //暂停

    //销毁围栏机制
    pthread_barrier_destroy(&barrier);
    return 0;
}

4. 围栏机制使用案例2

下面代码里设置栏杆等待线程数量为10个,然后启动循环创建10个线程,每个新的线程创建之后,都会在函数里打印第几个线程准备运行,当10个线程创建完毕之后,都在等待了,然后再一起放行。

设置线程为结合属性。

#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <semaphore.h>
#include <signal.h>

pthread_barrier_t barrier;

//线程工作函数
void *thread_work_func(void *arg)
{
    printf("线程%lu准备运行.\n",pthread_self());
    //等待人员到齐
    pthread_barrier_wait(&barrier);
    printf("线程%lu开始运行.\n",pthread_self());
}

int main(int argc,char **argv)
{  
    pthread_barrier_init(&barrier,NULL,10);

    /*1. 创建线程*/
    pthread_t thread_id[10];
    int i;
    for(i=0;i<10;i++)
    {
        if(pthread_create(&thread_id[i],NULL,thread_work_func,NULL))
        {
            printf("%d线程创建失败.\n",i);
            return 0;
        }
        sleep(1);
    }
    
    /*2. 等待子线程结束*/
    for(i=0;i<10;i++)
    {
        pthread_join(thread_id[i],NULL);
    }
    
    pthread_barrier_destroy(&barrier);
    return 0;
}
目录
相关文章
|
4天前
|
安全 前端开发 程序员
|
1天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【5月更文挑战第18天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,应用场景,以及如何优化线程池的性能。通过实例分析,我们将看到线程池如何提高系统性能,减少资源消耗,并提高系统的响应速度。
11 5
|
1天前
|
消息中间件 安全 Java
理解Java中的多线程编程
【5月更文挑战第18天】本文介绍了Java中的多线程编程,包括线程和多线程的基本概念。Java通过继承Thread类或实现Runnable接口来创建线程,此外还支持使用线程池(如ExecutorService和Executors)进行更高效的管理。多线程编程需要注意线程安全、性能优化和线程间通信,以避免数据竞争、死锁等问题,并确保程序高效运行。
|
1天前
|
安全 Java 容器
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第18天】随着多核处理器的普及,并发编程变得越来越重要。Java提供了丰富的并发编程工具,如synchronized关键字、显式锁Lock、原子类、并发容器等。本文将深入探讨Java并发编程的核心概念,包括线程安全、死锁、资源竞争等,并分享一些性能优化的技巧。
|
1天前
|
安全 Java 开发者
Java中的多线程编程:理解与实践
【5月更文挑战第18天】在现代软件开发中,多线程编程是提高程序性能和响应速度的重要手段。Java作为一种广泛使用的编程语言,其内置的多线程支持使得开发者能够轻松地实现并行处理。本文将深入探讨Java多线程的基本概念、实现方式以及常见的并发问题,并通过实例代码演示如何高效地使用多线程技术。通过阅读本文,读者将对Java多线程编程有一个全面的认识,并能够在实际开发中灵活运用。
|
2天前
|
运维 Linux
CentOS系统openssh-9,你会的还只有初级Linux运维工程师的技术吗
CentOS系统openssh-9,你会的还只有初级Linux运维工程师的技术吗
|
3天前
|
监控 JavaScript Linux
Linux系统之部署Homepage个人导航页
【5月更文挑战第13天】Linux系统之部署Homepage个人导航页
21 1
|
3天前
|
监控 Java 测试技术
在多线程开发中,线程死循环可能导致系统资源耗尽,影响应用性能和稳定性
【5月更文挑战第16天】在多线程开发中,线程死循环可能导致系统资源耗尽,影响应用性能和稳定性。为解决这一问题,建议通过日志记录、线程监控工具和堆栈跟踪来定位死循环;处理时,及时终止线程、清理资源并添加错误处理机制;编码阶段要避免无限循环,正确使用同步互斥,进行代码审查和测试,以降低风险。
18 3
|
4天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第15天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将通过实例分析,理解线程安全的重要性,并学习如何通过各种技术和策略来实现它。同时,我们也将探讨如何在保证线程安全的同时,提高程序的性能。
|
4天前
|
监控 JavaScript 网络协议
Linux系统之安装uptime-kuma服务器监控面板
【5月更文挑战第12天】Linux系统之安装uptime-kuma服务器监控面板
14 0