User Tools

Site Tools


os_cp:semaphores:solutions

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
os_cp:semaphores:solutions [2023/05/10 07:38] – utworzono jkonczakos_cp:semaphores:solutions [2023/09/15 13:18] (current) – jkonczak
Line 1: Line 1:
- 
 <html><div style="line-height:1em"></html> <html><div style="line-height:1em"></html>
 +
 +
 +~~Exercise.#~~
 +<code c>
 +#include <fcntl.h>
 +#include <semaphore.h>
 +#include <stdio.h>
 +
 +int main() {
 +  sem_t *mySemaphore = sem_open("/mySemaphore", O_CREAT | O_EXCL, 0666, 0);
 +  if (mySemaphore == SEM_FAILED) {
 +    perror("Creating the semaphore failed");
 +    return 1;
 +  }
 +  sem_wait(mySemaphore);
 +  return 0;
 +}
 +</code>
 +
 +<code c>
 +#include <fcntl.h>
 +#include <semaphore.h>
 +#include <stdio.h>
 +
 +int main() {
 +  sem_t *mySemaphore = sem_open("/mySemaphore", 0, 0666, 0);
 +  if (mySemaphore == SEM_FAILED) {
 +    perror("Opening the semaphore failed");
 +    return 1;
 +  }
 +  sem_post(mySemaphore);
 +  return 0;
 +}
 +</code>
 +
 +~~Exercise.#~~
 +
 <code c> <code c>
 #include <fcntl.h> #include <fcntl.h>
Line 79: Line 115:
 } }
 </code> </code>
 +
 +~~Exercise.#~~
 +
 +Line:
 +<code c> if (createSucceeded) sleep(10);</code>
 +added anywhere after line 13 and before line 22 delays the first process from
 +initializing the semaphore for 10 seconds. If another process attempts to wait
 +on uninitialized semaphore, it is likely to get stuck forever.
 +
 +~~Exercise.#~~
 +
 +Lines between ''sem_wait'' and ''sem_post'' are the critical region.
 +
 +~~Exercise.#~~
 +
 +When the program is run concurrently with arguments ''0 1'' and ''1 0'', it will
 +deadlock if both processes manage to acquire the first semaphore (respectively
 +''0'' for the first process, and ''1'' for the second) and then try to acquire
 +the second one (respectively ''1'' and ''0'').
 +
 +~~Exercise.#~~
 +
 +One of the simpler solutions is to wait on semaphores in a predefined order,
 +that is instead of:
 +<code c>
 +    sem_wait(&data->item[argOne].sem);
 +    sem_wait(&data->item[argTwo].sem);
 +</code>
 +one may just:
 +<code c>
 +    sem_wait(&data->item[argOne<argTwo?argOne:argTwo].sem);
 +    sem_wait(&data->item[argOne<argTwo?argTwo:argOne].sem);
 +</code>
 +    
 <html></div></html> <html></div></html>
 +
 +
 +~~META:
 +language = en
 +~~
 +
os_cp/semaphores/solutions.1683704319.txt.gz · Last modified: (external edit)