int progress; void signal_progress(int newprg){ atomic_write_int_to_finish_access(progress,newprg); } int wait_progress(int i){ int prg; do{ while(xread_int(progress) < i); }while((prg = atomic_read_int_to_start_access(progress)) < i); return prg; } |
int count = 0; void barrier_sync(int P){ int v; do{ v = xread_int(count); }while(cas_int_to_finish_access(count, v, (v+1 < P) ? v+1 : 0)); do{ while(xread_int(count) > 0); }while(atomic_read_int_to_start_access(count) > 0); } |
int ba[MAXPROC]; void init_barrier_sync(int P){ int i; for(i = 0; i < P; i++) ba[i] = 1; } void barrier_sync(int P, int myid){ if (myid == 0){ int i, b = -ba[0]; for(i = 1; i < P; i++) do{ while(xread_int(ba[i]) != b); }while(atomic_read_int(ba[i]) != b); start_access_after_read(); atomic_write_int_to_finish_access(ba[0],b); } else { int b = -ba[myid]; atomic_write_int_to_finish_access(ba[myid], b); do{ while(xread_int(ba[0]) != b); }while(atomic_read_int_to_start_access(ba[0]) != b); } } |
|
/* client */ while(cas_int_to_finish_access(port, 0, request)){ ... /* その他の処理(他への応答をする、など) */ } |
/* server */ do{ while(xread_int(port) == 0); }while((req = atomic_read_int_to_start_access(port)) == 0); atomic_write_int(port, 0); ... /* reqに応える */ |
/* writer */ vn = obj->vn; atomic_write_int_to_start_write(obj->vn, 0); obj->f1 = f1; obj->f2 = f2; obj->f3 = f3; atomic_write_int_to_finish_write(obj->vn, vn+2); |
/* reader */ do{ do{ while(xread_int(obj->vn) == 0); vn = atomic_read_int_to_start_read(obj->vn); }while(vn == 0); f1 = obj->f1; f2 = obj->f2; f3 = obj->f3; }while(atomic_read_int_to_finish_read(obj->vn) != vn); |