注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[pthread] 同步机制(4) ---- barrier (REALTIME)  

2010-01-06 21:36:33|  分类: pthread |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
barrier (栅栏),就是等待 N 个线程都到达了某一阶段后,同时唤醒。N 可以由 pthread_barrier_init 设置。被唤醒的所有线程中,有一个 pthread_barrier_wait 返回值为 PTHREAD_BARRIER_SERIAL_THREAD,其它为 0。

barrier 有个 process-shared 的属性,意义不大,忽略。
--------------------------------
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>

pthread_barrier_t global_barrier;

void *mythr(void *arg)
{
    int n = (int)arg;
    printf("thr #%d, enter, time = %d\n", n, time(NULL));
    sleep(n);
    if ( pthread_barrier_wait(&global_barrier) == PTHREAD_BARRIER_SERIAL_THREAD )
            printf("thr #%d, SERIAL_THREAD, leave, time = %d\n", n, time(NULL));
    else
            printf("thr #%d, leave, time = %d\n", n, time(NULL));
    return (void *)0;
}

int main()
{
    pthread_t pid1, pid2, pid3;
    pthread_barrier_init(&global_barrier, NULL, 3);

    pthread_create(&pid1, NULL, mythr, (void *)1);
    pthread_create(&pid2, NULL, mythr, (void *)3);
    pthread_create(&pid3, NULL, mythr, (void *)5);

    pthread_join(pid1, NULL);
    pthread_join(pid2, NULL);
    pthread_join(pid3, NULL);
    return 0;
}
--------------------------------
$ ./a.out
thr #3, enter, time = 1262784886
thr #5, enter, time = 1262784886
thr #1, enter, time = 1262784886
thr #5, SERIAL_THREAD, leave, time = 1262784891
thr #1, leave, time = 1262784891
thr #3, leave, time = 1262784891
--------------------------------


barrier 的实现

barrier 的功能很简单,自己可通过 mutex, cond 手工打造一个:
-------------------------------
/* kbarrier.h */
#ifndef KCODE_KBARRIER_H
#define KCODE_KBARRIER_H

#include <pthread.h>

#define KBARRIER_SERIAL_THREAD   -1

struct kbarrier;
typedef struct kbarrier *kbarrier_t;

int kbarrier_init(kbarrier_t *b, unsigned int cnt);
int kbarrier_destoy(kbarrier_t *b);
int kbarrier_wait(kbarrier_t *b);

#endif
-------------------------------
/* kbarrier.c */
#include <stdlib.h>
#include "kbarrier.h"

struct kbarrier {
    pthread_mutex_t m;
    pthread_cond_t  cond;
    unsigned int    cnt;
};

int kbarrier_init(kbarrier_t *b, unsigned int cnt)
{
    kbarrier_t impl = (kbarrier_t) malloc(sizeof(struct kbarrier));
    pthread_mutex_init(&impl->m, NULL);
    pthread_cond_init(&impl->cond, NULL);
    impl->cnt = cnt;

    *b = impl;
    return 0;
}

int kbarrier_destoy(kbarrier_t *b)
{
    pthread_mutex_destroy(&(*b)->m);
    pthread_cond_destroy(&(*b)->cond);
    free(*b);
    return 0;
}

int kbarrier_wait(kbarrier_t *b)
{
    kbarrier_t impl = *b;
    pthread_mutex_lock(&impl->m);

    impl->cnt--;
    if ( impl->cnt == 0 )
    {
        // last thread
        pthread_mutex_unlock(&impl->m);
        pthread_cond_broadcast(&impl->cond);
        return KBARRIER_SERIAL_THREAD;
    }

    // not the last one
    pthread_cond_wait(&impl->cond, &impl->m);
    pthread_mutex_unlock(&impl->m);
    return 0;
}
-------------------------------
  评论这张
 
阅读(3516)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017