• 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

    • Elden Ring Nightreign will finally gain ‘Duo Expeditions' next week by Pulasthi Ariyasinghe FromSoftware's latest project, Elden Ring Nightreign, delivered a multiplayer-focused experience for the first time. While the title offered solo runs as an alternative to its standard three-player Trio Expeditions, Duos were surprisingly missing at launch. A couple of months later, the developer is finally delivering this highly requested feature for the hit roguelike. On social media, the studio confirmed that Duo Expeditions will be hitting Elden Ring Nightreign with the next update, patch 1.02, for the game on July 30. Check out the newly released trailer showing off this mode below. As we mentioned in our review of Elden Ring Nightreign, everything from enemy health, boss aggression, player damage, and even XP gain changes depending on how many players are in the Expedition. A post-launch update even tweaked the difficulty to favor solos as well. Duos should have the same changes being applied, with the mode being easier than trios but harder than solos to complete. Making sure the difficulty is properly balanced has previously been given as the reason why the Duos mode has taken a while to come in. FromSoftware also confirmed that patch 1.02 will have a range of more quality-of-life improvements on the UI side. This will include more Relics filtering options, making custom builds easier to construct before going on new runs, as seen below. Publisher Bandai Namco also announced this week that the Elden Ring Shadow of the Erdtree expansion for the original open-world Soulslike recently passed 10 million players. Meanwhile, this Elden Ring Nightreign spin-off now has over 5 million players, making both massive successes for the publisher. While FromSoftware is now focusing on other projects, Bandai Namco isn't done with the Elden Ring universe just yet either, as a live-action movie has now been confirmed to be in development too.
    • Or you ignore the part where @Michael Scrip answered you directly.
    • The reasons for Microsoft being in near perpetual state of reorganization for two years is due to the 6 CapEx acquisitions between Jan 2022 and Jan 2023, Blizzard, Oribi, Minit, Miburo, Lumenisity and Fungible. There were 15 CapEx acquisitions in 2021 alone. Much like the Borg, Microsoft assimilates knowledge instead of expending resources on learning and development. 10 gaming companies, 3 AI and 1 data modeling companies since 2018. But then this is in the founding DNA of Microsoft, MS DOS wasn't made by MS, Windows was based on the Apple Mac and Xerox PARC Alto....and on and on. (To be fair Apple's Lisa and Mac were from the Alto also)
    • Can't get a pic of the physical server as it's in a DC, but what i'm running on it is doable. All for my own use except one VM used by a friend to run her site and other things.
    • Immediately using a VPN that makes me appear to be in the EU.
  • Recent Achievements

    • Very Popular
      d4l3d earned a badge
      Very Popular
    • Dedicated
      Stephen Leibowitz earned a badge
      Dedicated
    • Dedicated
      Snake Doc earned a badge
      Dedicated
    • One Month Later
      Philsl earned a badge
      One Month Later
    • One Month Later
      armandointerior640 earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      629
    2. 2
      ATLien_0
      237
    3. 3
      Xenon
      163
    4. 4
      neufuse
      123
    5. 5
      +FloatingFatMan
      123
  • Tell a friend

    Love Neowin? Tell a friend!