Linux同步4 ——barrier linux系统时间同步
barrier定义:typedef union{char__size[__SIZEOF_PTHREAD_BARRIER_T];long int __align;} pthread_barrier_t;
struct pthread_barrier{unsigned intcurr_event;//等待Count用变量int lock;unsigned intleft;//Down Counterunsigned intinit_count;//Counter初始值};
barrier初始化:intpthread_barrier_init (barrier, attr, count) pthread_barrier_t *barrier; constpthread_barrierattr_t *attr; unsigned int count;{struct pthread_barrier*ibarrier;
if (__builtin_expect(count == 0, 0)) returnEINVAL;
if (attr != NULL) { struct pthread_barrierattr *iattr;
iattr = (struct pthread_barrierattr *)attr;
if (iattr->pshared !=PTHREAD_PROCESS_PRIVATE &&__builtin_expect (iattr->pshared !=PTHREAD_PROCESS_SHARED, 0)) return EINVAL; }
ibarrier = (structpthread_barrier *) barrier;
ibarrier->lock =LLL_LOCK_INITIALIZER;ibarrier->left =count;ibarrier->init_count= count;ibarrier->curr_event= 0;
return 0;}
barrier等待:intpthread_barrier_wait (barrier) pthread_barrier_t *barrier;{struct pthread_barrier*ibarrier = (struct pthread_barrier *) barrier;int result = 0;
lll_lock(ibarrier->lock);--ibarrier->left;
//这种情况下,说明已经达到了指定的等待次数//唤醒所有的等待线程//虽然对最后一个调用该函数的线程返回PTHREAD_BARRIER_SERIAL_THREAD//但是POSIX规定这是 不 定 的if(ibarrier->left == 0) { ++ibarrier->curr_event;
lll_futex_wake(&ibarrier->curr_event,INT_MAX);
result = PTHREAD_BARRIER_SERIAL_THREAD; } else { unsigned int event =ibarrier->curr_event;
lll_unlock (ibarrier->lock);
do lll_futex_wait(&ibarrier->curr_event,event); w hile (event ==ibarrier->curr_event); }
unsigned int init_count =ibarrier->init_count;
if(atomic_increment_val(&ibarrier->left) ==init_count) lll_unlock (ibarrier->lock);
returnresult;}
API函数:int pthread_barrier_init(pthread_barrier_t *barrier, constpthread_barrierattr_t *attr, unsigned int count);int pthread_barrier_wait(thread_barrier_t *barrier);int pthread_barrier_destroy(ed_barrier_t *barrier);int pthread_barrierattr_init(pthread_barrierattr_t*attr);int pthread_barrierattr_setpshared(pthread_barrierattr_t*attr, int pshared);int pthread_barrierattr_getpshared(const pthread_barrierattr_t*attr, int *pshared);
更多阅读
如何在linux系统中设置静态ip地址 linux系统设置ip地址
如何在linux系统中设置静态ip地址——简介本篇主要是介绍一下在linux系统中设置静态ip地址方法。如何在linux系统中设置静态ip地址——工具/原料redhat6.4 x64如何在linux系统中设置静态ip地址——方法/步骤如何在linux系统中设置
如何查看linux系统版本 查看linux系统的位数 linux系统查看jdk版本
如何查看linux系统版本 查看linux系统的位数——简介 之前咗嚛介绍了如何查看linux系统下,各文件系统版本。根本经验主要看看linux下系统版本和操作系统位数如何查看。对于windows而已,linux版本有不同的版本号和内核等,本经验以Centos
linux系统改装win7 新机如何装win7系统
linux系统改装win7——简介很多新买的电脑都没有预装win系统,出厂厂家为了节约成本,一般预装了linux或dos,但是这个linux一般是国产的红旗linux,对于一般的用户根本没有任何可以使用的价值,连播放个视频可能就得捣鼓半天。所以
电脑时间不能同步怎么办?图文详解 电脑系统时间不能同步
? ? ?我们经常会遇到电脑时间不能同步,电脑时间不准确的现象,这个问题,可能对于很多电脑新手是个不小的麻烦,下面我就对此类问题分析,总结出几种原因,并给出解决办法,帮助大家解除此类烦恼。原因一:电脑主板中CMOS
Linux系统怎么安装Win7?安装XP或WIN7系统教程 win7换成xp系统教程
Linux是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。但是很多电脑用户还是习惯操作windows系统,这时候有些Linux系统用户就会选择在这系统基础上安装XP或WIN7系统。不同系统的安装步骤确实复杂了点,但是