2016-03-26 15 views
0

i jetzt ein Spiel für Linux-basierte Systeme zu schaffen, ich versuche, in denen es drei Prozesse:ein „Spiel“ mit 2 Spielern und Schiedsrichter (Prozesse) mit C in Linux-basierten System Erstellen

  1. Schiedsrichter - Hauptprozess
  2. Blau Player - Erstes Kind Prozess
  3. Red Player - Zweites Kind Prozess

natürlich sind die beiden untergeordneten Prozesse erstellt werden mit der fork() Funktion.

Jetzt ist alles erstellt, ich verwende Shared Memory zum Speichern der Platine und einige weitere Variablen, die die drei Prozesse gemeinsam sind.

Mein Problem ist, wenn ich darüber nachdenke, wie ich das rundenbasierte Spiel implementieren werde - ich habe eine gemeinsame boolesche Variable erstellt, die anzeigt, ob das Spiel noch läuft oder beendet ist und wer entscheidet, wer dran ist es.

Jetzt betreten wir den freigegebenen Teil, ich habe die beiden Kindprozesse pausiert und ein Signal an den ersten Kindprozess gesendet um ihn "aufzuwecken", aber von jetzt an wie halte ich alle drei Prozesse zusammen und synchronisiere (Der Schiedsrichter weckt die ersten Prozesse, er beendet den Zug und pausiert, als Schiedsrichter weckt den zweiten und so weiter ...)

Ich denke, ich muss diesen Teil in einer Art von while(game_finished == FALSE) Schleife halten, aber von dort ich ' Ich stecke fest.

Wie implementiere ich das Spiel so, wie ich es gerade erklärt habe? Vielen Dank.

+1

Müssen Sie fork?Das Einfädeln jedes Spielers scheint einfacher zu sein, so dass der Schiedsrichter sie aufwecken kann. – xvan

Antwort

2

Es gibt mehrere Alternativen, aber ein busy-wait gehört zu den schlechtesten. Sie könnten eine Lösung in Betracht ziehen, die auf gemeinsamen Semaphoren basiert, aber ich würde eine basierend auf Pipes wählen. Ein Prozess blockiert die Ausführung eines Lesevorgangs für einen geöffneten Dateideskriptor, von dem derzeit keine Daten verfügbar sind. Auf diese Weise können die verschiedenen Prozesse auf einfache Weise aufeinander warten.

Erstelle nur Rohre in jeder Richtung zwischen dem Schiedsrichterprozess und jedem Spielerprozess. Bei jedem Spielzug versucht jeder Spieler, ein Byte vom Schiedsrichter zu lesen. Es wird nicht weitergehen, bis der Schiedsrichter etwas an sein Ende schreibt. Als Bonus können die geschriebenen Bytes zusätzliche Daten/Anweisungen übermitteln, um beispielsweise zwischen "make a play" und "game over" zu unterscheiden. Die gleiche Art der Synchronisation funktioniert natürlich auch in der anderen Richtung.

1

Da Sie separate Prozesse verwenden möchten, ist eine Möglichkeit zu erreichen, was Sie wollen Barrieren zu verwenden. Du hast bereits einen "Controller" -Prozess und die Spieler haben ein einfaches Statusverhalten (warte eine Runde, spiele eine Runde). Der Controller-Prozess (der Schiedsrichter, wie Sie es nennen) kann signalisieren, dass das Kind den Zustand des Spiels verarbeitet und alles an Barrieren synchronisiert.

Unten ist der Pseudo-Code einer stark vereinfachten Version:

// Controller 
while (game_running) { 
    barrier 1 
    // wait for player1 
    barrier 2 
    // wait for player2 
} 

// Player 1 
while (game_running) { 
    barrier 1 // Sinchronize with controller 
    // do stuff 
    barrier 2 
} 

// Player2 
while (game_running) { 
    barrier 1 // Wait for player1 
    barrier 2 
    // do stuff 
} 

Einige zusätzlichen Barrieren sind wahrscheinlich dem Steuerungsprozess die Daten von den Spielern zu erlauben, und dann synchronisieren, die Spieler erforderlich, aber dies ist ein grundlegender Mechanismus der Kontrolle mehrere Spieler.

Für weitere Informationen über die Barriere Funktionalität durch die Linux-API zur Verfügung gestellt, lesen Sie in diesem Link: http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_barrier_wait.html

+0

Ich glaube nicht, dass Barrieren die richtige Synchronisationsgrundlage für diesen Job sind. Ihre übliche Verwendung zu mehr oder weniger dem Gegenteil davon, Fäden zu machen, wechseln sich ab - sie werden verwendet, um Fäden an einem Synchronisationspunkt zu sammeln, bis genug dort ankommt, und dann lassen sie * alle * zusammen vorgehen. –

+0

Darüber hinaus bin ich unsicher (und finde keine Dokumentation für) die Implementierung der Pthreads-Barriere, die über mehrere Prozesse hinweg funktioniert. –