1

I have created 10 threads and want to execute in a round robin fashion for 3 times. Initially all threads are waiting. Main threads sends signal to thread 0, on receiving signal thread 0 woke up and then perform some task and then send signal to thread 1 and this repeats like thread1-> thread2->thread3 ....->thread9. then thread 9-> thread 0.

I am trying to implement this

thread i, does some task, then send signal to thread (i+1) and then thread i goes for sleep. thread (i+1) will wake up after t sec (means thread i+1 wakeup time - thread i sleep time = t sec ), thread (i+1) will do some task, send signal to thread (i+2) and go for sleep and this will repeat for few(3) times.

Although I am able to send signal from thread 0-> thread 1 -> .... thread 9 (loop executed only once ), I am not able to send signal thread 9 -> thread 0 and that's why I am not able to repeat this loop for 3 times.

where I am making mistakes ?

Any help will be highly appreciated . I am using g++ 4.6.3 under linux kernel 2.6.32.

Here is my expected output

    Create 5 threads
    Thread created=0
    Thread created=1
    Thread created=2
    Thread created=3
    Thread created=4
    Thread 4 blocked
    Thread 3 blocked
    Thread 2 blocked
    Thread 1 blocked
    Thread 0 blocked
    Wake up all waiting threads...
    Thread 0 unblocked
    Thread 1 unblocked
    Thread 2 unblocked
    Thread 3 unblocked
    Thread 4 unblocked

    Thread 4 blocked // repeataion of same sequence
    Thread 3 blocked
    Thread 2 blocked
    Thread 1 blocked
    Thread 0 blocked
    Thread 0 unblocked
    Thread 1 unblocked
    Thread 2 unblocked
    Thread 3 unblocked
    Thread 4 unblocked


    Wait for threads and cleanup
    Main completed

Here is my actual output

Create 5 threads
Thread created=0
Thread created=1
Thread created=2
Thread created=3
Thread created=4
Thread 4 blocked
Thread 3 blocked
Thread 2 blocked
Thread 1 blocked
Thread 0 blocked
Wake up all waiting threads...
Thread 0 unblocked
Thread 1 unblocked
Thread 2 unblocked
Thread 3 unblocked
Thread 4 unblocked
Wait for threads and cleanup
Main completed

Here is my code

#include <pthread.h>
#include <iostream>
#include <stdio.h>


/* For safe condition variable usage, must use a boolean predicate and   */
/* a mutex with the condition.                                           */
int                 conditionMet = 0;
pthread_cond_t      cond[5];

pthread_mutex_t     mutex = PTHREAD_MUTEX_INITIALIZER;

#define NTHREADS    5

void *threadfunc(void *parm)
{

  int i;
  long my_id = (long)parm;
  int           rc;

// Initially all threads will wait 
rc = pthread_mutex_lock(&mutex);
printf("Thread %d blocked\n",my_id);
rc = pthread_cond_wait(&cond[my_id], &mutex);
printf("Thread %d unblocked\n", my_id);
rc = pthread_mutex_unlock(&mutex);

int count=0;

while(count++<3) // This line makes no sense, no repeatation as expected. 
{

  rc = pthread_mutex_lock(&mutex);

  while (!conditionMet) {
    printf("Thread %d blocked\n",my_id);
    rc = pthread_cond_wait(&cond[my_id], &mutex);
    printf("Thread %d unblocked\n", my_id);
  }

  rc = pthread_mutex_unlock(&mutex);

  // sending signal to next thread i+1
 rc = pthread_mutex_lock(&mutex);
    rc = pthread_cond_signal(&cond[(my_id+1)%NTHREADS]);
    rc = pthread_mutex_unlock(&mutex);

   }
      return NULL;
   }

    int main(int argc, char **argv)
    {
  int                   rc=0;
  int                   i;
  pthread_t             threadid[NTHREADS];

    for(rc=0;rc<NTHREADS;rc++)
    cond[rc]= PTHREAD_COND_INITIALIZER;

  printf("Enter Testcase - %s\n", argv[0]);

  printf("Create %d threads\n", NTHREADS);
  for(i=0; i<NTHREADS; ++i) {
    rc = pthread_create(&threadid[i], NULL, threadfunc, (void *)i);
    printf("Thread created=%d\n", i);
  }

  sleep(5);  /* Sleep is not a very robust way to serialize threads */
  rc = pthread_mutex_lock(&mutex);

  /* The condition has occured. Set the flag and wake up any waiting threads */
  conditionMet = 1;
  printf("Wake up all waiting threads...\n");
  rc = pthread_cond_signal(&cond[0]);    
  rc = pthread_mutex_unlock(&mutex);      

  printf("Wait for threads and cleanup\n");
  for (i=0; i<NTHREADS; ++i) {
    rc = pthread_join(threadid[i], NULL);        
  }
  pthread_cond_destroy(&cond[0]);
  pthread_mutex_destroy(&mutex);

  printf("Main completed\n");
  return 0;
}
bholanath
  • 1,699
  • 1
  • 22
  • 40

1 Answers1

0

After referring to pthread_wait I myself solved my problem.

All the threads runs in a round robin sequence for once, then the program terminate/complete execution as NO threads are WAITING for next turn, all finished .

So to run the same sequence multiple (3) times, wait variable needs to modified correctly so that each thread will wait for next turn until 3 execution.

Here is modified program :

void *threadfunc(void *parm)
{

  int i;
  long my_id = (long)parm;
  int           rc;

   /*
 DELETE THIS PORTION, OTHERWISE NO OUTPUT, AGAIN HANGED BEFORE SINGLE SEQUENCE.
 IT WILL NOT ENTER INSIDE LOOP while(count++<3)

    // Initially all threads will wait 
    rc = pthread_mutex_lock(&mutex);
    printf("Thread %d blocked\n",my_id);
    rc = pthread_cond_wait(&cond[my_id], &mutex);
    printf("Thread %d unblocked\n", my_id);
    rc = pthread_mutex_unlock(&mutex);
    */


int count=0;

while(count++<3)
{

  rc = pthread_mutex_lock(&mutex);
  while ( conditionMet != my_id) 
   {
    printf("Thread %d blocked\n",my_id);
    rc = pthread_cond_wait(&cond[my_id], &mutex);
    printf("Thread %d unblocked\n", my_id);
   }

    rc = pthread_mutex_unlock(&mutex);     
    rc = pthread_mutex_lock(&mutex);
    conditionMet = (my_id+1)%NTHREADS ; // This is important to wait for next time
    rc = pthread_cond_signal(&cond[(my_id+1)%NTHREADS]);
    rc = pthread_mutex_unlock(&mutex);
}
  return NULL;
}
Community
  • 1
  • 1
bholanath
  • 1,699
  • 1
  • 22
  • 40