Ich beginne meine Studien mit syncronized Fäden mit semaphore
.
Ich habe gerade einen Test mit binären Semaphor (nur 2 Threads) und es ist alles gut.Hersteller/Verbraucher mit Semaphor
Stellen Sie sich ein Lanhouse vor, das 3 Computer (Threads) und einige Clients (Threads) hat. Wenn alle Computer bussy sind, wartet der Client in einem queue
mit einem bekannten Limit (z. B. 15 Clients).
Ich kann nicht verstehen, wie Threads miteinander in Beziehung stehen.
Soweit ich weiß, semaphore
wird verwendet, um den Zugriff der Threads auf eine bestimmte kritische Region/Speicherbereich/globale Variable zu steuern.
1) Erstellen Sie 1 Semaphor, um die Clients zu steuern, die auf die Computer zugreifen (aber beide sind Threads);
2) Erstellen Sie 1 Semaphor zur Steuerung der Clients in queue
;
Aber wie beziehen sich Threads mit Threads? Wie der Semaphor weiß, mit welchen Threads er arbeiten soll.
Ich brauche keine vollständige Antwort dafür. Ich muss nur verstehen, wie die Threads
miteinander in Beziehung stehen. Einige helfen, die Situation zu verstehen.
Das ist mein Code so weit und es funktioniert nicht, P kann die Clients nicht steuern, um auf die 3 verfügbaren Computer zuzugreifen.
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define ROOM_SIZE 15
sem_t queue, pc, mutex;
int room [ROOM_SIZE];
int pcsAvaliable = 3, nAvaliable = 0, roomAvaliable = ROOM_SIZE;
int computers [3]; // 0 -> Empty | 1 -> Ocuppied
void* Lan(void* arg)
{
//Enter the lanhouse
//Verify if there is a computer avaliable
sem_wait(&pc);
if(pcsAvaliable > 0)
{
sem_wait(&mutex);
pcsAvaliable--;
computers[nAvaliable] = 1;
printf("Cliente pegou pc: %d\n", nAvaliable);
nAvaliable++;
sem_post(&mutex);
//Wait for 80~90ms
printf("Client liberou pc: %d\n", nAvaliable);
computers[nAvaliable] = 0;
nAvaliable--;
sem_post(&pc);
}
else
{
printf("No computer avaliable...\n");
//Check the waiting room for avaliable slot
if(roomAvaliable > 0)
{
roomAvaliable--;
printf("Client entered the waiting room.");
}
else
printf("No avaliable space in waiting room..\n");
}
}
int main(int argc, char const *argv[])
{
int i;
if(argc > 1)
{
int numClients = atoi(argv[1]);
sem_init(&pc, 0, 3);
sem_init(&mutex, 0, 1);
pthread_t clients[numClients];
//Create Clients
for(i=0; i< numClients; i++)
{
pthread_create(&clients[i], NULL, Lan, NULL);
}
//Join Clients
for(i=0; i< numClients; i++)
{
pthread_join(clients[i], NULL);
}
}
else
printf("Please, insert a parameter.");
pthread_exit(NULL);
sem_destroy(&pc);
return 0;
}
Wird Post bearbeiten mit den gemeinsamen Funktionen in beiden Fällen –
Ich lese einige Antworten des Themas, das Sie gepostet, ich denke, ich sollte Semaphor sowieso verwenden ... Nur nicht, wie man die "Kunden" zu kontrollieren, ' Computer 'und' Warteschlange '. Irgendwelche Tipps ? – PlayHardGoPro
Ich würde eine Warteschlange Datenstruktur für die Warteschlange verwenden (das wird ein wenig komplexer sein), oder vielleicht ein Ringpuffer. Wenn Sie wissen, dass die maximale Anzahl an Clients für den Puffer reicht. Während Sie Clients empfangen, platzieren Sie sie in der Warteschlange/dem Puffer, und wenn ein Computer freigibt, weisen Sie den nächsten Client dem Computer zu. Wenn Sie Semaphore verwenden, wenn ein Client sem_post verlässt und ein Handler den Wert der Semaphore für jeden Computer überprüft, sobald Sie> 0 sind, weisen Sie ihm einen Client zu. Wenn du etwas Code postest, könnte ich ein wenig mehr helfen. Ich gebe nur Ideen, damit Sie versuchen können, anzufangen. –