2009-08-03 7 views
0

on m'a demandé d'écrire: entrer dans la fonction et la fonction de sortie pour le cas suivant:N processus et types M de processus - entrée et la sortie cs

il existe des processus et des types de processus M N (N >> M) Il existe une section critique dans laquelle tous les processus du même type peuvent entrer. par exemple: si le type A est dans cs, le type B ne peut pas entrer cs. mais tous les processus avec le type A peuvent entrer.

Je ne peux utiliser que mutex et "type" qui est le type du processus. L'interblocage n'est pas autorisé.

Pensez-vous que ce soit OK?

shared: this.type = -1; 
mutex m, m1=1; 

enter{ 
    down(m) 
    if (this.type == process.type) up(m1) 
    down(m1) 
    this.type= process.type 
    up(m) 
} 
exit { 
    this.type = -1 
    up(m1) 
} 

Merci! (en passant, ce n'est pas HW.J'ai un examen et je suis en train de résoudre des tests des années précédentes)

+0

Est-ce que ce sont les devoirs? Si oui, veuillez marquer en conséquence. – tvanfosson

Répondre

0

Je dirais non, la méthode actuelle n'est pas correcte.

Spécifiquement, disons qu'un type 0 entre et passe à travers. le type 1 vient ensuite avant que le type 0 soit quitté. Il frappe le mutex, trouve que le type de processus est faux et se verrouille sur m1. Le type 0 vient ensuite, déverrouille m, réinitialise le type de processus et le verrouillage sur m1 est toujours actif.

En outre, si vous avez 2 processus de type 0, le premier à quitter entraînera la réinitialisation du type de processus en cours alors que les processus sont toujours dans la section critique. Je fais l'hypothèse que 'up' s'apparente au déverrouillage, et 'down' s'apparente à lock; Cela ressemble à un ensemble de méthodes destinées à un sémaphore. Je fais également l'hypothèse qu'il n'y a que deux mutex pour le système (m et m1); comme le balisage n'est pas parfaitement clair à ce sujet.

EDIT: La suggestion que vous offre sortirait quelque chose comme ceci:

shared: this.type = -1; 
mutex m, m1=1; 
count=0; 

enter{ 
    down(m) 
    if (this.type == process.type) up(m1) 
    down(m1) 
    this.type= process.type 
    count++; 
    up(m) 
} 
exit { 
    count--; 
    if(count==0) this.type = -1 
    up(m1) 
} 

Cela a encore le problème que la sortie est pas thread-safe sur les modifications de l'Etat; et que lorsqu'un nouveau processus est éveillé/commence à s'exécuter, ses frères ne sont pas éveillés.

Je ne suis pas entièrement certain qu'il existe un moyen sûr de le faire sans variables de condition; à moins qu'il n'y ait plus d'informations sur le problème disponible. (c'est-à-dire dans le contexte d'un 'Monitor', où les exécutions de méthodes sont déjà threadsafe)

0

Je pense à ce que vous dites et en effet je peux voir le problème - 10X!

qu'en est-il de l'ajout d'un compteur? lorsque le premier processus du même type entrer si le compteur == == 0 Type process.type (initialiser le type)

en sortie: counter-- et i va cheack si (chiffre == 1) Type = -1.

mieux ??

+0

(J'ai édité ma réponse); l'ajout d'un compteur pourrait résoudre certains problèmes, mais il ne suffira pas à tous les résoudre; et je soupçonne qu'il n'y a pas une méthode pour s'y prendre en toute sécurité sans une autre construction de filetage. Et je soupçonne toujours que vous utilisez des sémaphores plutôt que des mutex. – CoderTao

Questions connexes