2010-10-11 7 views
3

Si vous n'êtes pas familier avec le problème, c'est quelque chose comme this.Problème de pont à une seule voie

Je ne suis pas venu pour demander une réponse, j'ai en fait terminé tout mon codage. Je viens de constater que ma solution ne la résout pas le mieux possible, car ma solution ne permet qu'une seule voiture à la fois sur le pont. J'espérais pouvoir obtenir quelques conseils sur la façon d'utiliser sem_wait et sem_post pour résoudre ce problème. J'espère permettre au trafic qui coule dans la même direction de circuler ensemble et pas un à la fois.

Ma solution semble actuellement quelque chose comme:

(le nord et le sud de défaut = 1 pour déverrouillées pour 1 voiture)

IF northcar puis sem_wait (sud), sem_wait (nord). Traversez le pont, puis sem_post (nord), sem_post (sud). C'est évidemment faux parce que c'est bloquer le pont de toutes les voitures autres que celui sur lui. Je veux permettre au trafic de circuler ensemble. Des idées? J'utilise du trafic généré aléatoirement, ce qui ajoute un peu de complexité à celui-ci.

Répondre

3

Dans la vraie vie vous résoudriez ce problème avec un feu rouge-nord/vert-sud, vert-nord/rouge-sud, ou rouge-nord/rouge-sud, et des capteurs dans l'approche et des voies de sortie aux deux extrémités du pont. Supposons que la lumière commence à rouge-nord/vert-sud. Les voitures peuvent circuler du sud au nord sans s'arrêter. Quand une voiture approche du nord, elle s'arrête au feu rouge et déclenche le capteur d'approche nord. Cela rend la lumière rouge-sud, mais c'est aussi rouge-nord. Lorsque toutes les voitures qui se trouvent actuellement sur le pont sont parties (déclenchant le capteur de sortie nord à leur sortie), la lumière peut changer vers le vert nord. Cet état persiste jusqu'à ce qu'une autre voiture arrive du sud et déclenche le capteur d'approche sud. Pensez à la manière dont vous traduiriez cela en code.

(Vous aurez besoin d'utiliser la propriété de comptage des sémaphores.)

+0

par la propriété comptant que vous voulez dire incrémenter/décrémenter avec post/wait, ainsi que sem_getvalue? –

+0

À la réflexion, l'une des conditions est que lorsqu'aucune voiture n'est sur le pont, les feux des deux extrémités sont verts. Je pensais que cela fonctionnerait laisser les voitures courir aux lumières et le premier là au nord ou au sud peut entrer et rendre l'autre extrémité rouge. Cependant, j'ai été incapable de le faire efficacement avec sem_wait et sem_post –

+0

Q1: Oui, en comptant la propriété, je veux dire incrémentation/décrémentation avec post/wait. Q2: Dans la vraie vie, vous ne faites jamais de feu vert simultanément dans des directions conflictuelles. Pensez à ce qui se passe si deux voitures s'approchent du pont à grande vitesse dans les deux directions en même temps; le pilote qui perd la course n'a peut-être pas le temps de s'arrêter. Une situation similaire pourrait se produire dans votre code si les sémaphores sont tous les deux "verts" en même temps. – zwol

1

Voici un pseudo python que je viens de fouiller. Fondamentalement bloquer une façon et laisser un nombre limité de voitures à travers. Selon la façon dont vous utilisez vos variables, cela pourrait être tout à fait tort: ​​

function main(): 
    while(true): 
     if(north_car): 
      let_north_cars_through() 
     if(south_car): 
      let_south_cars_through() 


function let_south_cars_through(): 
    sem_wait(north) 
    for(i = 0; i < max cars; i++): 
     if(south_car): 
      cross_bridge() 
     else: 
      break; 

    sem_post(north) 

function let_north_cars_through() 
    sem_wait(south) 
    for(i = 0; i < max cars; i++): 
     if(north_car): 
      cross_bridge() 
     else: 
      break; 

    sem_post(south) 
+0

Ceci est assez intéressant, mais que faire si le flux de voitures est aléatoire, comme (n = nord et s = sud) n, n, n, s, s, n, n, n, n, s, s, s, s. C'est une sorte de comment je l'ai approché en utilisant un fil comme le trafic aléatoire avec un boîtier de commutateur pour les voitures nord/sud. –

+0

Ah.Je pensais que les voitures du nord entreraient dans une file d'attente et sud entreraient dans une autre file d'attente. Hmmm .. – MStodd