痛み無料卵はの宿題6.828を行います
ここで https://pdos.csail.mit.edu/6.828/2018/homework/barrier.html
それは障壁を達成するために、ミューテックスと条件変数を使用するように私たちを必要とします。
障壁を感じることは睡眠ロックの点では本のようなものです。この実施例に特有の前部は、ミューテックス、条件変数を前記、それは、それぞれ、以下のミューテックスCONDであり、そしてaはスピンロックsleeplockあります。
pthread_cond_waitの(&指揮、&ミューテックス)。 // ロックミューテックスの解放し、condをスリープ状態に入る pthread_cond_broadcastの(&指揮を)。 //は、condを寝てすべてのスレッドを覚まします
実際には、制御bstate.nthread値が、各スレッドは、それが最初の場合であれば、この値は、それらが第一又は第二のスレッドを入力していることを知って何を検出し、バリア{}内の充填の実際の内容第二は、そのように一緒にラウンドごとにその二つのスレッドを確保するために、最初のウェイクアップを入れて、ハングアップ。
私はちょうど++四捨五入する各ラウンドの後に忘れて、長い時間のために混乱し始めました。。。
する#include <STDLIB.H> する#include <unistd.h> する#include <stdio.hに> の#include <assert.h> の#include <pthread.hの> // の#define SOL 静的INT nthread = 1 。 静的int型ラウンド= 0 ; 構造体バリア{ barrier_mutex pthread_mutex_t。 pthread_cond_tのbarrier_cond。int型 nthread; // バリアのこのラウンドに達しているスレッド数INTラウンドを。 // バリアラウンド} BSTATE。静的無効 barrier_init(ボイド) { アサート(pthread_mutex_initの(&bstate.barrier_mutex、NULL)== 0 )。 アサート(てpthread_cond_init(&bstate.barrier_cond、NULL)== 0 )。 bstate.nthread = 0 ; } 静的 ボイド バリア() { pthread_mutex_lockの(&bstate.barrier_mutex)。 もし(!(bstate.nthread)){ bstate.nthread ++ ; pthread_cond_waitの(&(bstate.barrier_cond)、&(bstate.barrier_mutex))。 } 他{ bstate.nthread- ; bstate.round ++ ; pthread_cond_broadcastの(&(bstate.barrier_cond)); } pthread_mutex_unlockの(&bstate.barrier_mutex)。 } 静的 ボイド * スレッド(ボイド * XA) { 長い N =(長い)XA。 長い遅延; int型私は、 用(i = 0 ; iは< 20000 ; iは++ ){ int型 T = bstate.round。 (I主張 == t)を、 障壁を(); usleep(ランダム() %100 )。 } } int型 のmain(int型 ARGC、CHAR * ARGV []) { がpthread_tの *のTHA。 ボイド *の値。 長いI; ダブルT1、T0; もし(ARGC < 2 ){ 関数fprintf(stderrに、" %S:%S nthread \ n "、ARGV [ 0 ]、ARGV [ 0 ])。 出口( - 1 )。 } nthread = ATOI(ARGV [ 1 ])。 THA = malloc関数(はsizeof(がpthread_t)* nthread)。 srandom(0 )。 barrier_init(); 用(i = 0 ; iは<nthread; iは++ ){ アサート(のpthread_create(&THA [i]は、NULL、スレッド、(ボイド *)は、i)== 0 )。 } のための(i = 0 ; iはnthread <; Iは++ ){ (pthread_joinを(THA [i]は、アサート&値)== 0 )。 } のprintf(" OK;通過する\ n " ); }