Sunday, May 18, 2014

Thread synchronization to print alternate numbers in two threads irrespective of scheduling.



#include <stdio.h>
#include <pthread.h>
//#define

int gcount;
int thread_1();
int thread_2();

pthread_mutex_t count_mutex;
pthread_cond_t count_threshold_cv;


int main(int argc,char *argv[])
{

    pthread_attr_t *attr;
    pthread_t threadId[3];

    pthread_mutex_init(&count_mutex, NULL);
    pthread_cond_init (&count_threshold_cv, NULL);

    printf("entering main \n");

    pthread_create(&threadId[1],NULL,(void*)thread_1,NULL);
    pthread_create(&threadId[2],NULL,(void*)thread_2,NULL);

    while(1){
        sleep(2);
    };
    return 0;
}

int thread_1()
{
    printf("thread1 running \n");
    while(1)
    {
        pthread_mutex_lock(&count_mutex);

        while(gcount%2 == 0)
        {
            pthread_cond_wait(&count_threshold_cv,&count_mutex);
        }
        if(gcount %2 == 1)
        {
            printf("thread1: %d \n",gcount++);
            pthread_cond_signal(&count_threshold_cv);
            sleep(2);
        }

        pthread_mutex_unlock(&count_mutex);

        //        printf("thread1 : counter %d \n",gcount++);
    }
    return 1;
}

int thread_2()
{
    printf("thread2 running \n");
    while(1)
    {
        pthread_mutex_lock(&count_mutex);

        while(gcount%2 == 1)
        {
            pthread_cond_wait(&count_threshold_cv,&count_mutex);
        }
        if(gcount%2 == 0)
        {
            printf("thread2: %d \n",gcount++);
            pthread_cond_signal(&count_threshold_cv);
            sleep(2);
        }

        pthread_mutex_unlock(&count_mutex);
    }
    return 1;
}