semaphore problem???


 
Thread Tools Search this Thread
Top Forums Programming semaphore problem???
# 1  
Old 12-21-2011
semaphore problem???

Hi friends,
I want to print the the following sequence of numbers using sempahores.
2 3 2 3 2 3 2 3

But something seems to be wrong regarding my concept of semaphores, I am using a single function, a single semaphore, and two threads, but I am not succeeding to achieve my goal,
it prints as
2 2 2 3 3 3
When I use two seperate functions for the two threads, and use two semaphores, the program works then, what's wrong? You can see my code
One more thing, the for loop seems to have no affect on sem_wait() and sem_post, because 2 2 2 and then 3 3 3 is printed, why is that so? My query is that sem_wait() should lock the semaphore, print two, then sem_post() should unlock, and then back to the loop. Please clearify this to me

Looking forward to your lovely replies.



Code:
 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/sem.h>
 
int pargc;
char **pargv;
sem_t sem;
void *Print(void *);
int main(int argc, char *argv[])
{
        pargv = argv;
        sem_init(&sem,0,1);
        pthread_t tid1;
        pthread_t tid2;
        int t1 = 1;
        int t2 = 2;
        pthread_attr_t attr1;
        pthread_attr_t attr2;
        pthread_attr_init(&attr1);
        pthread_attr_init(&attr2);
        {
        pthread_create(&tid1,&attr1,Print,(void *)2);
        pthread_create(&tid2,&attr2,Print,(void *)3);
        }
        {
        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);
        }
        printf("\nThreads finished!\n");
        return 0;
}
void *Print(void *n)
{
        int i = 0;
        int x;
        x = (int)n;
        for(i = 0;i<3;i++)
        {
        sem_wait(&sem);
        printf("%d ",x);
        sem_post(&sem);
        }
        return (void *)(1);
}


Last edited by gabam; 12-21-2011 at 10:20 AM..
# 2  
Old 12-21-2011
If thread 2 was waiting on the semaphore, thread 1 should only be given one turn, but what if thread 2 hasn't gotten that far yet? Nothing will stop thread 1 from taking as many turns as it wants.

Thread 2 might start running first, for that matter. There's no guarantees on timing between separate threads.

---------- Post updated at 10:18 AM ---------- Previous update was at 10:13 AM ----------

On further testing it seems I'm mistaken. Even when there's something else waiting, nothing stops thread 1 from grabbing the semaphore several times in a row. The same happens with a mutex. It doesn't act like a queue to make order predictable.

Last edited by Corona688; 12-21-2011 at 12:28 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Semaphore

I was asked to add this piece of code to a c program which I will execute through the shell: for(long i = 0; i < NITER; i++) { sem_wait( &sema); count++; sem_post( &sema); } I didn't get it, which is the critical section ? if it's "count++" how would a thread wake up in order to enter it... (1 Reply)
Discussion started by: uniran
1 Replies

2. Programming

Semaphore

If I create a semaphore and then I fork a number of child processes then all the child process use that same semaphore. Since the process address spaces are different rfom each other then how all the child process are able to access the same semaphore? I understand that semaphore/mutex is at os... (0 Replies)
Discussion started by: rupeshkp728
0 Replies

3. Programming

Single Semaphore problem???

Hi friends, I have this very famous Operating System book titiled, "Operating System Concepts" by Abaraham Silbertschatz 7th edition. Regarding the semaphores, here is a paragraph from the book which says, We can also use semaphores to solve various synchronization problems. For example,... (1 Reply)
Discussion started by: gabam
1 Replies

4. Shell Programming and Scripting

semaphore

Control two exclusively shared resources(semaphore). The two resources are two files. The producer will write even numbers to one file, and odd numbers to another one. The consumer respectively reads from each file until it gets 5 even numbers and 5 odd numbers. Can any one help me with the... (0 Replies)
Discussion started by: gokult
0 Replies

5. UNIX for Dummies Questions & Answers

semaphore

what is semaphore? can any body explain it in a more simple way than the manual ?? replies appreciated Regards raguram R (7 Replies)
Discussion started by: raguramtgr
7 Replies

6. Shell Programming and Scripting

Semaphore

Hi, I am looking to use a semaphore for the first time in one of my scripts. I am just wondering if there are any simple examples or tutorials around? I am a beginner so the simpler the better :) Thanks -Jaken (2 Replies)
Discussion started by: Jaken
2 Replies

7. UNIX for Advanced & Expert Users

Semaphore problem....

I'm having an issue implementing my semaphores.... The following is how I'm setting up the semaphore. First: I get the semkey (which I've wrapped in an IF statement using perror() but in an attempt to keep the code clutter free I've removed it here) semkey = ftok("./request", 'S' ) ... (1 Reply)
Discussion started by: Dreams in Blue
1 Replies

8. Programming

Problem with releasing semaphore lock

Hi, I am trying to write stuff to a shared memory using a writer, and reading the corresponding stuff using a reader. I am facing problems while releasing the lock, as a result of which I am having segmentation faults. The code is as follows... /********** writer.c ***********/ ... (1 Reply)
Discussion started by: jacques83
1 Replies

9. UNIX for Dummies Questions & Answers

Semaphore

Hi, I'm new to UNIX. I need to know what's a semaphore Do reply. Thanks VJ (3 Replies)
Discussion started by: vjsony
3 Replies

10. UNIX for Dummies Questions & Answers

semaphore

hi, is there any command where we can monitor semaphores? (1 Reply)
Discussion started by: yls177
1 Replies
Login or Register to Ask a Question