thread barrier

之前也介紹過線程之間的同步和互斥,接下來看一下barrier过牙。假設(shè)我們要執(zhí)行一個包含兩個階段的多線程計算甥厦,但是我們不希望在完成第一階段之前進(jìn)入第二階段。我們可以使用一種稱為屏障(barrier)的同步方法寇钉。當(dāng)線程到達(dá)barrier時刀疙,它將在barrier處等待,直到所有線程到達(dá)barrier摧莽,然后它們將一起進(jìn)行庙洼。

如何理解barrier呢?就像和一些朋友一起遠(yuǎn)足。大家會會記下有多少個朋友油够,并同意在每個山峰的頂部等彼此蚁袭。假設(shè)你是第一個到達(dá)第一個山頂?shù)娜耍銓⒃陧敳康绕渌笥咽АK麄儠灰坏竭_(dá)頂部揩悄,但是直到最后一個人到達(dá)之前,沒有人會繼續(xù)走鬼悠。等所有人都到了之后删性,大家將繼續(xù)進(jìn)行。

Pthreads具有實現(xiàn)該功能的函數(shù)pthread_barrier_wait()焕窝。需要聲明一個pthread_barrier_t變量蹬挺,并使用pthread_barrier_init()對其進(jìn)行初始化。 pthread_barrier_init()將將要參與barrier的線程數(shù)作為參數(shù)它掂。

下面是一個示例程序:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>

#define THREAD_COUNT 4

pthread_barrier_t mybarrier;

void* threadFn(void *id_ptr) {
  int thread_id = *(int*)id_ptr;
  int wait_sec = 1 + rand() % 5;
  printf("thread %d: Wait for %d seconds.\n", thread_id, wait_sec);
  sleep(wait_sec);
  printf("thread %d: I'm ready...\n", thread_id);

  pthread_barrier_wait(&mybarrier);

  printf("thread %d: going!\n", thread_id);
  return NULL;
}


int main() {
  int i;
  pthread_t ids[THREAD_COUNT];
  int short_ids[THREAD_COUNT];

  srand(time(NULL));
  pthread_barrier_init(&mybarrier, NULL, THREAD_COUNT + 1);

  for (i=0; i < THREAD_COUNT; i++) {
    short_ids[i] = i;
    pthread_create(&ids[i], NULL, threadFn, &short_ids[i]);
  }

  printf("main() is ready.\n");

  pthread_barrier_wait(&mybarrier);

  printf("main() is going!\n");

  for (i=0; i < THREAD_COUNT; i++) {
    pthread_join(ids[i], NULL);
  }

  pthread_barrier_destroy(&mybarrier);

  return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巴帮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虐秋,更是在濱河造成了極大的恐慌榕茧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件客给,死亡現(xiàn)場離奇詭異用押,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)靶剑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門蜻拨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抬虽,你說我怎么就攤上這事官觅。” “怎么了阐污?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵休涤,是天一觀的道長。 經(jīng)常有香客問我笛辟,道長功氨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任手幢,我火速辦了婚禮捷凄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘围来。我一直安慰自己跺涤,他們只是感情好匈睁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桶错,像睡著了一般航唆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上院刁,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天糯钙,我揣著相機(jī)與錄音,去河邊找鬼退腥。 笑死任岸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狡刘。 我是一名探鬼主播享潜,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颓帝!你這毒婦竟也來了米碰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤购城,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后虐译,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘪板,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年漆诽,在試婚紗的時候發(fā)現(xiàn)自己被綠了侮攀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡厢拭,死狀恐怖兰英,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情供鸠,我是刑警寧澤畦贸,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站楞捂,受9級特大地震影響薄坏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寨闹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一胶坠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧繁堡,春花似錦沈善、人聲如沸乡数。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞳脓。三九已至,卻和暖如春澈侠,著一層夾襖步出監(jiān)牢的瞬間劫侧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工哨啃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烧栋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓拳球,卻偏偏與公主長得像审姓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子祝峻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容