• 0

Using semaphores


Question

Hello, this is the first time I need to use semaphores, yes it is for an assignment. I have trouble wrapping my head around the concept. Come to think of it, wrapping a solid spheroidal body around an idea isn't trivial by itself, but anyway I disgress.

I have to write a little program that simulates a network. There are several computers in the network. Only one computer can be executing at any given time, and they must execute one after the other. Also, each computer is responsible for telling the "next" computer that it is its time to execute.

I am supposed to use semaphores to synchronize this. Now I don't see really how can semaphores help me do this. My first idea would be to make a "cycle" object, protected with a mutex, so only one computer can own the cycle at any given time. The computer could write in a global variable the id of the next computer and unlock the mutex when it's done. However, we're supposed to use semaphores, not mutexes.

Oh and it's POSIX semaphores and pthreads btw.

Thanks.

Link to comment
https://www.neowin.net/forum/topic/749492-using-semaphores/
Share on other sites

13 answers to this question

Recommended Posts

  • 0

I only covered semaphores on my course a few weeks back but I think the basic principle is the same as the mutex in that it creates a critical region that only one thread/process can access at one.

For example:

You spawn 2 threads to carry out some job, but only one can execute at the one time. Initially you set the semaphore to 1.

The first thread to call wait(sem) decrements the semaphore and is allowed to continue. The slower of the two threads is blocked at the wait statement because sem cannot be < 0. When the first thread is finished the work it is to carry out, it performs a signal(sem) which increments the semaphore, allowing the second thread to decrement it, and continue. This could also be looped so they can pass it back and forth between them. You will probably need a small wait after the signal though however to ensure that the other thread has enough time to perform the wait.

Think that's right. Hope it helps.

  • 0

Hmm, so you know how to do this using a mutex but not a semaphore? A mutex is basically just a binary semaphore. Of course since you said you need to control the order, right? As in there's a specific ordering to the "computers" and you want to loop through each, activating them in sequence? So couldn't you just have each node in the network provide its own semaphore that it blocks on until the preceding node signals it?

Or are you supposed to using a counting semaphore somehow, or only signal computers that have requested to be called when its their turn?

  • 0
  Quote
Hmm, so you know how to do this using a mutex but not a semaphore? A mutex is basically just a binary semaphore.
Well I know how pthread_mutex works but I never used semaphore.h. Also, I understand the concept of a mutex (locking/unlocking a resource), but I don't get the concept of a "non-binary" one. What, so you can lock the resource a certain number of times before it's, uh, really locked? :unsure:
  Brandon Live said:
Of course since you said you need to control the order, right? As in there's a specific ordering to the "computers" and you want to loop through each, activating them in sequence?
Yes exactly. It should go like this :

Computer 1 does cycle #1

Computer 2 does cycle #1

Computer 3 does cycle #1

Main thread does some checking routine

Computer 1 does cycle #2

Copmuter 2 does cycle #2

etc.

Each computer is its own thread.

  Quote
So couldn't you just have each node in the network provide its own semaphore that it blocks on until the preceding node signals it?
Can you explain your idea a bit further please ?
  Quote
Or are you supposed to using a counting semaphore somehow, or only signal computers that have requested to be called when its their turn?
It just says "use semaphors to order the computers". Edited by Dr_Asik
  • 0
  Dr_Asik said:
  Quote
So couldn't you just have each node in the network provide its own semaphore that it blocks on until the preceding node signals it?

Can you explain your idea a bit further please ?

I think he means that the first task signals the semaphore for task 2 so it can begin.

Maybe something like this?

Thread 1

task1 = 1;

wait(task1);

signal(task2);

Thread 2

The task2 semapohre is initially set to 0 until it is signalled from thread 1, so thread 2 blocks at the wait statement.

wait(task2);

.

.

.

.

signal(task3);

etc.

  • 0

Relinquishing the semaphore key is not a good idea, whos to say computer 3 wont get the key when its computer 2 that wants it.

C subroutines to checkout

sem_post(), sem_wait()

signals.h

in this u can do something like kill(PID, SIGINT); which will send the pid(computer#) a signal interrupt.

..
	signal(SIGINT, s_handler);
...

void s_handler(int sig)
{
	   switch(sig)
	   {
		case SIGINT:
			 //grab key and begin execution
		 }
}

once u set up the signals to recieve sigint, you can communicate with processes to grab the semaphore key instead of all processes waiting for it.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Oh man! I can't wait! 😁
    • slowness that result in unproductive, when something was easy fast one click now its basically 2 or 3 clicks and more mouse movement not the end of the world sure but forcing changes for the sake of it for no good reason its one reason why people dont like 11.
    • WhatsApp for Android expands chat themes with 18 new colors by Paul Hill The WhatsApp Beta for Android has just been updated to version 2.25.19.2 (via WABetaInfo) bringing with it 18 new color options, expanding the selection from 20 to 38 colors. This update brings the Android app up to parity with the iOS version, which got this beta update at the start of the month. The expansion of colors will give users greater personalization options for their WhatsApp chats. You can pick the new colors individually per chat or from the settings for every chat, complementing the existing support for various custom backgrounds. How the new chat themes work To set the new colors for individual chats, just open the chat you want to theme, press the three dot menu in the top right and go to themes and change the chat color. To change the theme color across the whole of the app, just go to settings and then select chats and change the chat theme. The new colors are compatible with both light and dark modes and affect the message bubbles. Unlike Messenger where theme changes can be seen by your contact, theme changes in WhatsApp are only visible to the user who applies it. User reception and future outlook Most people running WhatsApp are using the stable version, so you won’t see these new theme colors yet, we will have to wait a bit longer for that. Even if you’re on the beta, the feature may not be available yet as it’s being rolled out. While not a massive change, lots of people like to theme their WhatsApp messages so this change will be welcomed by those that do that. The messaging app scene is very competitive, so this will help Meta retain users on WhatsApp by boosting satisfaction. If you have had a chance to try out the new themes, let us know in the comments what you think!
    • Yup, that thing. Thank you. I found it invaluable for workflow.
    • Windows 11 finally gets a small, but long-requested Windows 10 taskbar feature — and it is not the ability to use small taskbar buttons.
  • Recent Achievements

    • Explorer
      Legend20 went up a rank
      Explorer
    • One Month Later
      jezzzy earned a badge
      One Month Later
    • First Post
      CSpera earned a badge
      First Post
    • One Month Later
      MIR JOHNNY BLAZE earned a badge
      One Month Later
    • Apprentice
      Wireless wookie went up a rank
      Apprentice
  • Popular Contributors

    1. 1
      +primortal
      618
    2. 2
      ATLien_0
      277
    3. 3
      +FloatingFatMan
      178
    4. 4
      Michael Scrip
      150
    5. 5
      Steven P.
      115
  • Tell a friend

    Love Neowin? Tell a friend!