#include #include #include #include static int global12, global23, global13; monitor monitor_t {}; static monitor_t m1, m2, m3; void increment( monitor_t * mutex p1, monitor_t * mutex p2, int * value ) { *value += 1; } struct MyThread { thread_desc __thrd; int target; }; DECL_THREAD(MyThread); void ?{}( MyThread & this, int target ) { this.target = target; } void ^?{}( MyThread & mutex this ) {} void main( MyThread* this ) { for(int i = 0; i < 1000000; i++) { choose(this->target) { case 0: increment( &m1, &m2, &global12 ); case 1: increment( &m2, &m3, &global23 ); case 2: increment( &m1, &m3, &global13 ); } } } int main(int argc, char* argv[]) { processor p; { scoped(MyThread) * f[6]; for(int i = 0; i < 6; i++) { f[i] = (*(scoped(MyThread) *)malloc()){ i % 3 }; } for(int i = 0; i < 6; i++) { delete( f[i] ); } } sout | global12 | global23 | global13 | endl; }