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.
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.
If you're keeping track of the thread id's, you might want to try pthread_join.
ASKER
that is not what I'm looking for
ASKER
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
ASKER
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.
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.
Use pthread_mutex_init to create the mutex, mutex_lock and mutex_unlock to signal and wait for a critical section.
ASKER
nahumd,
can you point me somewhere where there is an example or a how-to document, other than man pages?
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_m ax, &count_mutex);
printf("Inside the watch() and the value is %d\n", count);
fflush(stdout);
}
/*unlock the variable*/
pthread_mutex_unlock(&coun t_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(&coun t_mutex);
sleep(rand()%2);
}
}
This is give you an idea on how to use mutex
/* 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],
pthread_create(&thread[0],
pthread_create(&thread[1],
for(i=0; i< 3 ; i++)
{
pthread_join(thread[i], NULL);
}
}
void * watch(int *id)
{
/* lock the variable */
pthread_mutex_lock(&count_
while(count <= MAX_COUNT)
{
/* using the condition variable for waiting for the event */
pthread_cond_wait(&count_m
printf("Inside the watch() and the value is %d\n", count);
fflush(stdout);
}
/*unlock the variable*/
pthread_mutex_unlock(&coun
}
void * increment(int *id)
{
int i;
for(i=0; i< MAX ; i++)
{
/* lock the variable */
pthread_mutex_lock(&count_
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
/*unlock the variable*/
pthread_mutex_unlock(&coun
sleep(rand()%2);
}
}
This is give you an idea on how to use mutex
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.