|
|
|
|
||||||
| fr.comp.os.linux.config Prise en main d'un système Linux. |
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonjour
Dans le cadre de la programmation de sémaphores sous Linux, j'ai besoin de poser 2 sémaphores de façon atomique sur deux variables différentes. /* déclaration de la structure "operation" struct sembuf *operation; /* identifiant du sémaphore avec 500 éléments (le sémaphore existe déjà) semid=semget(CLE_SEM, 500,0); /* Si je veux poser une réservation par sémaphore sur l'accès n° 200 et 250 par exemple, je peux écrire : /* opération P sur le sémaphore operation.sem_num = 200; operation.sem_op = -1; operation.sem_flg = 0; semop(semid,&operation,1); operation.sem_num = 250; operation.sem_op = -1; operation.sem_flg = 0; semop(semid,&operation,1); /* opération V sur les sémaphores operation.sem_num=200; operation.sem_op=1; operation.sem_flg=0; semop(semid,&operation,1); operation.sem_num=250; operation.sem_op=1; operation.sem_flg=0; semop(semid,&operation,1); /* cependant je voudrais poser un sémaphore sur deux indices "atomiquement" car dans l'exemple ci-dessus j'ai un risque de réordonnancement entre les deux opérations V et donc un risque d'interbloquage avec d'autres processus. /* opération P sur le sémaphore d'indice 200 ET 250 operation.sem_num=200; operation.sem_op = -1; operation.sem_flg=0; semop(semid,&operation,2); Comment faut-il faire ? Merci de votre aide... |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
OoO Lors de la soirée naissante du vendredi 29 décembre 2006, vers
17:25, "Laurent" <l_dubois92@hotmail.com> disait: > Dans le cadre de la programmation de sémaphores sous Linux, j'ai besoin de > poser 2 sémaphores de façon atomique sur deux variables différentes. Ben, man semop. La fonction en question prend un tableau de sémaphores (le dernier argument est la taille de celui-ci). -- I WILL NOT CUT CORNERS " " " " " " " " " " " " -+- Bart Simpson on chalkboard in episode 7F11 |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
Alors il faut rédiger :
struct sembuf *operation[2]; semid=semget(CLE_SEM, 500,0); /* opération P sur le sémaphore operation[0].sem_num = 200; operation[0].sem_op = -1; operation[0].sem_flg = 0; operation[1].sem_num = 250; operation[1].sem_op = -1; operation[1].sem_flg = 0; semop(semid,&operation,2); correct ? "Vincent Bernat" <bernat@luffy.cx> a écrit dans le message de news: m3hcvea16w.fsf@neo.luffy.cx... > OoO Lors de la soirée naissante du vendredi 29 décembre 2006, vers > 17:25, "Laurent" <l_dubois92@hotmail.com> disait: > >> Dans le cadre de la programmation de sémaphores sous Linux, j'ai besoin >> de >> poser 2 sémaphores de façon atomique sur deux variables différentes. > > Ben, man semop. La fonction en question prend un tableau de sémaphores > (le dernier argument est la taille de celui-ci). > -- > I WILL NOT CUT CORNERS > " " " " " " > " " " " " " > -+- Bart Simpson on chalkboard in episode 7F11 |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
OoO En cette soirée bien amorcée du vendredi 29 décembre 2006, vers
22:30, "Laurent" <l_dubois92@hotmail.com> disait: > Alors il faut rédiger : > struct sembuf *operation[2]; struct sembuf operation[2]; > semid=semget(CLE_SEM, 500,0); > /* opération P sur le sémaphore > operation[0].sem_num = 200; > operation[0].sem_op = -1; > operation[0].sem_flg = 0; > operation[1].sem_num = 250; > operation[1].sem_op = -1; > operation[1].sem_flg = 0; > semop(semid,&operation,2); semop(semid, operation, 2) > correct ? Oui. Cela dit, si c'est un exercice, on ne s'attend pas à utiliser cet "artifice" mais à jouer plus finement avec les sémaphores, voire à implémenter des moniteurs de Hoare. C'est assez loin pour moi, toutefois. -- BOFH excuse #29: It works the way the Wang did, what's the problem |
|
![]() |
| Outils de la discussion | |
|
|