Link to home
Start Free TrialLog in
Avatar of ragaMuffin
ragaMuffin

asked on

pthread sync

I have an application that is getting bigger and bigger and application threads are running wild.  someone told me to use semaphore to syncronize them.  
for instance,  i have thread1, thread2, thread3, thread4, ..... thread22.
i want thread2 to wait on 1 and I want thread 3 to wait on thread2. I want threads 15-22 to wait on thread7 , then thread8 wait on thread22   got the picture?, why make them threads, because each one is responsible for a specific HW.
my questions are:
-->could I use semaphore for this, or is there a better way
------->if semaphore will do the job, is there somewhere i can learn they quick, how-to, tutorial, examples, etc etc?
-------> if ! what can I use?

ps.  the order of threads might change, I could stop thread2, then thread3 will wait for thread1.
Avatar of mnashadka
mnashadka

If you're keeping track of the thread id's, you might want to try pthread_join.
Avatar of ragaMuffin

ASKER

that is not what I'm looking for
It should be like an interrupt, each device, or thread get a slice of the 20 mils, so all threads must run once, during an interval of 20 milliseconds
and pthread_join, waits until the thread exits, my threads are running still.  so you see I'm looking for a scheduler.
sorry for the multiple comments.
Yes you can use semaphore (mutex) to synchronize the threads as you wanted.
Use pthread_mutex_init to create the mutex, mutex_lock and mutex_unlock to signal and wait for a critical section.
nahumd,
can you point me somewhere where there is an example or a how-to document, other than man pages?
/* This example is copied from */
/* http://www.coe.uncc.edu/~abw/parallel/pthreads/pthreads.html */
/* It illustrates the idea of shared memory programming */

/* Comments: the behavior of this program on Solaris 2.7 is quite different from that of Red Hat Linux 6.2. On Solaris, the program acted incorrectly while the outcome on Red Hat Linux 6.2 was as expected. X.M. */

#include <pthread.h>  
#include <stdio.h>
#define MAX 10
#define MAX_COUNT 15

void * increment(int *id);
void * watch(int *id);

int count =0;
pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t count_max = PTHREAD_COND_INITIALIZER;
int thread_id[3]  = {0,1,2};

main()
{
        int i;
        /* define the type to be pthread */
       
        pthread_t thread[3];
        /* create 3 threads*/
        pthread_create(&thread[2], NULL, (void *)watch, &thread_id[2]);
        pthread_create(&thread[0], NULL, (void *)increment, &thread_id[0]);
        pthread_create(&thread[1], NULL, (void *)increment, &thread_id[1]);
       
        for(i=0; i< 3 ; i++)
        {
                pthread_join(thread[i], NULL);
        }
}

void * watch(int *id)
{
        /* lock the variable */
        pthread_mutex_lock(&count_mutex);
        while(count <= MAX_COUNT)
        {
                /* using the condition variable for waiting for the event */
                pthread_cond_wait(&count_max, &count_mutex);
                printf("Inside the watch() and the value is %d\n", count);
          fflush(stdout);
        }
        /*unlock the variable*/
        pthread_mutex_unlock(&count_mutex);
}

void * increment(int *id)
{
     int i;
     for(i=0; i< MAX ; i++)
     {
          /* lock the variable */
          pthread_mutex_lock(&count_mutex);
          count++;
          printf("in increment counter by threadof id :%d, and count: %d\n",*id, count);
       fflush(stdout);
          /* for the condition notify the thread */
          pthread_cond_signal(&count_max);
          /*unlock the variable*/
          pthread_mutex_unlock(&count_mutex);
          sleep(rand()%2);
     }
}
This is give you an idea on how to use mutex
ASKER CERTIFIED SOLUTION
Avatar of garboua
garboua

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial