int main() { int i; mythread_t thread[NR_THREADS]; mythread_setconcurrency(3); mythread_mutex_init(&mutex, NULL); mythread_cond_init(&okToProceed, NULL); for (i = 0; i < NR_THREADS; i++) mythread_create(&thread[i], NULL, runner, NULL); sleep(2); printf("Main: sending broadcast signal to all threads\n"); fflush(stdout); mythread_cond_broadcast(&okToProceed); printf("Main: joining all threads\n"); fflush(stdout); for (i = 0; i < NR_THREADS; i++) mythread_join(thread[i], NULL); printf("Main: about to exit\n"); fflush(stdout); mythread_exit(NULL); mythread_cond_destroy(&okToProceed); mythread_mutex_destroy(&mutex); return 1; }
void *thread1() { // printOut(itoa(mythread_self(),10)); // printOut("Thread1\n"); int i=0; while(i<200) { mythread_mutex_lock(&lock); glval++; //usleep(100); if(glval==100) { printOut("Thread1 sleeping for 10000 microseconds to hit blocking mutex condition in thread2\n"); mythread_cond_signal(&cond); mythread_cond_broadcast(&cond1); usleep(10000); } mythread_mutex_unlock(&lock); printOut("Using IO in thread1 \n"); i++; } }
// grab the mutex, increment the count to 100. Send signal to waiting threads. Unlock the mutex and wait on barrier. void *foo2 (void *arg) { int test; mythread_mutex_lock (&mut); while (count < 100) { count++; } if ( mythread_cond_broadcast (&con) != 0) PASS--; if ( mythread_mutex_unlock (&mut) != 0) PASS--; if ((test = mythread_barrier_wait (&barr) != 0) && (test != MYTHREAD_BARRIER_SERIAL_THREAD)) PASS--; return NULL; }
int main(int argc, char **argv) { int i; char buffer[1024]; futex_init(&printFutex, 1); mythread_t mythread1[NTHREADS]; mythread_t signalingThread[NTHREADS/2]; mythread_setconcurrency(4); mythread_mutex_init(&mutex,NULL); mythread_cond_init(&condition,NULL); mythread_barrier_init(&barrier,NULL,NTHREADS+1); /* Create Threads */ for(i=0;i<NTHREADS;i++){ sprintf(buffer, "Created thread : %d\n", i+1); printToConsole(buffer); mythread_create(&mythread1[i],NULL,&thread_func, NULL); } /*Signal threads waiting on cond var*/ while(count<NTHREADS){ /* Special case for testing broadcast*/ if(count == NTHREADS/2){ mythread_cond_broadcast(&condition); }else{ mythread_cond_signal(&condition); } } /* Waiting on barrier. Last thread, or this main thread will unblock the barrier depending on the execution sequence */ mythread_barrier_wait(&barrier); sprintf(buffer, "Out of barrier, main thread exiting..\n"); printToConsole(buffer); /* Destroy mutex, barrier and cond*/ mythread_cond_destroy(&condition); mythread_mutex_destroy(&mutex); mythread_barrier_destroy(&barrier); sprintf(buffer, "Finished Execution\n"); printToConsole(buffer); }
int main() { int i; mythread_t thread[NTHREADS]; mythread_setconcurrency(NTHREADS+1); mythread_mutex_init(&mut, NULL); mythread_cond_init(&cond, NULL); for(i = 0; i < NTHREADS; i++) mythread_create(&thread[i], NULL, fun, NULL); for(i = 0; i < INT_MAX/10; i++); printf("Broadcast\n"); fflush(stdout); mythread_cond_broadcast(&cond); printf("Now join\n"); fflush(stdout); for(i = 0; i < NTHREADS; i++) mythread_join(thread[i], NULL); printf("main exit\n"); fflush(stdout); mythread_exit(NULL); mythread_cond_destroy(&cond); mythread_mutex_destroy(&mut); return 1; }