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);
|