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天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
19 5
linux系统服务二!
|
4天前
|
Linux 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
20 3
linux系统服务!!!
|
4天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
16 2
|
5天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
15天前
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
111 5
|
15天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
51 4
|
2天前
|
缓存 监控 Linux
|
5天前
|
Linux Shell 数据安全/隐私保护
|
6天前
|
域名解析 网络协议 安全
|
13天前
|
监控 Linux Shell