pthread使用barrier栅栏方式同步

博客搬家,原地址:https://langzi989.github.io/2018/07/05/pthread使用barrier栅栏方式同步/Linux中提供了多种同步机制,其中使用barrier(栅栏)是多线程之间进行同步的方法之一。基本原理:假设多个线程约定一个栅栏,只有当所有的线程都达到这个栅栏时,栅栏才会放行,否则到达此处的线程将被阻塞。使用场景:程序启动的时候,需要建立一个独...
摘要由CSDN通过智能技术生成

博客搬家,原地址:https://langzi989.github.io/2018/07/05/pthread使用barrier栅栏方式同步/

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

基本原理

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

使用场景

程序启动的时候,需要建立一个独立的线程去做一些特殊的工作。比如这个线程需要初始化一些全局配置等等。而主线程启动后,必须等待这个子线程拿到配置信息后,才能继续工作。所以这里就存在一个问题要解决,主线程如何等待这个子线程完成工作后,才继续往下执行呢?

栅栏相关API

#include <pthread.h>

//初始化栅栏,栅栏需要等待到count个线程,才会全部一起放行。
int   pthread_barrier_init(pthread_barrier_t *restrict,
                        const pthread_barrierattr_t *restrict, unsigned count);

//报道函数,当一个线程到达栅栏的时候&
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程栅栏是一种同步机制,用于确保所有线程在达到某个点之前都被阻塞,直到所有线程都到达该点后才能继续执行。下面是一个使用pthread库编写的线程栅栏测试程序: ``` #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define NUM_THREADS 5 #define BARRIER_COUNT 5 int count = 0; pthread_mutex_t count_mutex; pthread_cond_t count_threshold_cv; void *thread_func(void *thread_id) { int i, j; long tid; tid = (long)thread_id; for (i = 0; i < BARRIER_COUNT; i++) { pthread_mutex_lock(&count_mutex); count++; if (count == NUM_THREADS) { printf("Thread %ld: Barrier reached.\n", tid); pthread_cond_broadcast(&count_threshold_cv); } else { printf("Thread %ld: Waiting at barrier.\n", tid); pthread_cond_wait(&count_threshold_cv, &count_mutex); } pthread_mutex_unlock(&count_mutex); } pthread_exit(NULL); } int main() { int i; long thread_ids[NUM_THREADS]; pthread_t threads[NUM_THREADS]; pthread_mutex_init(&count_mutex, NULL); pthread_cond_init(&count_threshold_cv, NULL); for (i = 0; i < NUM_THREADS; i++) { thread_ids[i] = i; pthread_create(&threads[i], NULL, thread_func, (void *)&thread_ids[i]); } for (i = 0; i < NUM_THREADS; i++) { pthread_join(threads[i], NULL); } pthread_mutex_destroy(&count_mutex); pthread_cond_destroy(&count_threshold_cv); return 0; } ``` 该程序创建了5个线程,每个线程都会执行5次循环。在每次循环中,线程都会增加计数器的值,然后等待其他线程到达同一个点。当所有线程都到达该点时,一个线程会打印一条消息,然后广播一个条件变量以释放所有线程。 这个程序展示了线程栅栏的基本思想和实现方式。通过使用互斥锁和条件变量,我们可以确保所有线程在到达某个点之前都被阻塞,直到所有线程都到达该点后才能继续执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值