// Francisco Arroyo shared struct { int nO = 0; // Oxygen atom's counter int nH = 0; // Hydrogen atom's counter int fO = 0; // Flag to let finish one O thread int fH = 0; // Flag to let finish one H thread } R; O() { region R do { nO++; } region R when ( (fO>0) || (nO>0 and nH>1) ) do { if ( fO ) { fO--; } else { // Enough atoms to make water printf("Making water ... \n"); nO--; nH -= 2; fH = 2; } } // Thread finish, atom used to make water } H() { region R do { nH++; } region R when ( (fH>0) || (nO>0 and nH>1) ) do { if ( fH ) { fH--; } else { // Enough atoms to make water printf("Making water ... \n"); nO--; nH -= 2; fH = 1; fO = 1; } } // Thread finish, atom used to make water }