Utilisation d'un éditeur Nous allons utiliser le logiciel libre Gedit afin d'écrire nos programmes. Si vous êtes sous Debian ( ou debian-like ) et qu'il n'est pas installé, IL suffit de l'installer via cette commande : sudo apt-get install



Yüklə 0,51 Mb.
səhifə36/43
tarix04.01.2022
ölçüsü0,51 Mb.
#61490
1   ...   32   33   34   35   36   37   38   39   ...   43
En utilisant des semaphores

Il existe une alternative aux variable mutex qui est la mise en œuvre explicite des commandes Acquire et Release.

Une technique standard pour résoudre ce problème consiste à utiliser une variable pour indiquer quelle tâche à le contrôle des moteurs. Les autres tâches ne sont pas autorisées à contrôler les moteurs jusqu'à ce que la première tâche l'indique, en utilisant une variable. Une telle variable est souvent appelé un sémaphore. Prennont sem comme étant un sémaphore ( comme un mutex ). Nous supposons que la valeur 0 indique qu'aucune tâche ne contrôle les moteurs (les ressources sont libres). Maintenant, chaque fois qu'une tâche veut faire quelque chose avec les moteurs il exécute les commandes suivantes:

until (sem == 0);

sem = 1; //Acquire(sem);

// Fait quelque chose avec les moteurs

// C'est la région critique

sem = 0; //Release(sem);

Donc, nous attendons d'abord que personne n'utilise les moteurs. Ensuite, nous demandons le contrôle par la mise à 1 de sem. Maintenant, nous pouvons contrôler les moteurs. Quand nous auront fini, nous mettrons sem à 0. Regardez le programme ci-dessus, qui utilise les sémaphores. Lorsque le capteur tactile touche quelque chose, le sémaphore est à 1 et la procédure de recul est en marche. Au cours de cette procédure, la tâche move_square doit attendre. Au moment où le recul est terminé, le sémaphore est remis à 0 et la tâchemove_square peut continuer.

int sem;


task move_square()

{

while (true)



{

until (sem == 0);

sem = 1;

OnFwd(OUT_AC, 75);

sem = 0;

Wait(1000);

until (sem == 0);

sem = 1;


OnRev(OUT_C, 75);

sem = 0;


Wait(850);

}

}



 

task submain()

{

SetSensor(IN_1, SENSOR_TOUCH);



while (true)

{

if (SENSOR_1 == 1)



{

until (sem == 0);

sem = 1;

OnRev(OUT_AC, 75);

Wait(500);

OnFwd(OUT_A, 75);

Wait(850);

sem = 0;


}

}

}



 

task main()

{

sem = 0;


Precedes(move_square, submain);

}

On pourrait dire qu'il n'est pas nécessaire dans move_square de mettre le sémaphore à 1 et ensuite à 0. Pourtant c'est utile. La raison en est que le OnFwd() commande est en fait deux commandes (voir chapitre précédent). Vous ne voulez pas que cette séquence de commande soit interrompue par l'autre tâche.



Les sémaphores sont très utiles et, lorsque vous écrivez des programmes compliqués avec des tâches parallèles, ils sont presque toujours nécessaire. (Il ya encore une petite risque qu'ils échouent. Essayez de comprendre pourquoi.)


Yüklə 0,51 Mb.

Dostları ilə paylaş:
1   ...   32   33   34   35   36   37   38   39   ...   43




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin