#include #include "thread.h" /* thread interface */ #include "semaphore.h" /* semaphore interface */ #include "queue.h" /* queue interface */ /* the thread functions */ int task1(void); int task2(void); int task3(void); int task4(void); /* the semaphore */ sema4 a_semaphore; int main(int argc, char **argv) { int i; /* init the semaphore */ a_semaphore = (sema4) sema4_new(1); /* create threads, check for errors */ if(thread_init() < 0) { fprintf(stderr,"Error initializing threads.\n"); exit(1); } if(thread_create(task1, 1) < 0) { fprintf(stderr,"Error starting task 1.\n"); exit(1); } if(thread_create(task2, 2) < 0) { fprintf(stderr,"Error starting task 2.\n"); exit(1); } if(thread_create(task3, 3) < 0) { fprintf(stderr,"Error starting task 3.\n"); exit(1); } if(thread_create(task4, 4) < 0) { fprintf(stderr,"Error starting task 4.\n"); exit(1); } while(1) { printf("MAIN THREAD\n"); for(i=0; i<9000000; i++) ; } thread_exit(); return 0; } //task implementations int task1(void) { int i,j,k,x; while(1){ printf("\tTHREAD 1 - start of loop\n", i); //delay loop for(j=0; j<1000; j++); printf("\tTHREAD 1 - calling P\n"); sema4_p(a_semaphore); printf("\tTHREAD 1 - inside critical section\n"); //delay loop for(x=0; x<100000000; x++); printf("\tTHREAD 1 - leaving the critical section\n"); sema4_v(a_semaphore); } thread_exit(); } int task2(void) { int i,j,k,x; while(1) { printf("\t\tTHREAD 2 - start of loop\n", i); //delay loop for(j=0; j<1000; j++); printf("\t\tTHREAD 2 - calling P\n"); sema4_p(a_semaphore); printf("\t\tTHREAD 2 - inside critical section\n"); //delay loop for(x=0; x<100000000; x++); printf("\t\tTHREAD 2 - leaving the critical section\n"); sema4_v(a_semaphore); } thread_exit(); } int task3(void) { int i,j,k,x; while(1) { printf("\t\t\tTHREAD 3 - start of loop\n"); //delay loop for(j=0; j<1000; j++) ; printf("\t\t\tTHREAD 3 - calling P\n"); sema4_p(a_semaphore); printf("\t\t\tTHREAD 3 - inside critical section\n"); //delay loop for(x=0; x<100000000; x++); printf("\t\t\tTHREAD 3 - leaving the critical section\n"); sema4_v(a_semaphore); } thread_exit(); } int task4(void) { int i,j,k,x; while(1) { printf("\t\t\t\tTHREAD 4 - start of loop\n", i); //delay loop for(j=0; j<1000; j++); printf("\t\t\t\tTHREAD 4 - calling P\n"); sema4_p(a_semaphore); printf("\t\t\t\tTHREAD 4 - inside critical section\n"); //delay loop for(x=0; x<100000000; x++); printf("\t\t\t\tTHREAD 4 - leaving the critical section\n"); sema4_v(a_semaphore); } thread_exit(); }