Frage

ich Programmierung ein Interkommunikationsmodul (Verfahren A und Verfahren B).

Gibt es eine Möglichkeit der Kommunikation Faden in B laufen kann (sein Unlock), sobald Prozess A eine bestimmte Aktion beendet ist, meine ich, ohne B jede Abfrage zu tun, noch B zu viel warten, nachdem A seine Aktion beendet?

Welche sind die Konzepte / Modelle / Design Patterns diese Bereiche festgelegt? (Etwas präziser als Inter Synchronisation). Welche Bibliotheken / Methoden empfehlen Sie?

Danke.

Edit: Ich bin auf der Suche nach Methoden, geeignet für jede der drei Haupt OSes. Ms Windows, Apple Mac OS X, GNU / Linux

War es hilfreich?

Lösung

Das ist ziemlich harter Job:

Für Unix-Betriebssysteme können Sie:

  • Pthread Zustand und Mutex mit setpshared Argumente.

    Hinweis: es unterstützt auch unter Linux 2.6, Solaris, aber es funktioniert nicht FreeBSD und Cygwin (nicht wissen, über Mac OS X)

  • unterstützt
  • Für Unix-Varianten können Sie auch genannt Semaphore verwenden, aber ich weiß nicht, das Unterstützungsniveau von ihnen

  • Für Windows gibt es einige Veranstaltungen ...

Das ist harte Arbeit, vor allem für IPC ...

Wenn Sie also etwas portable wollen, würde ich vorschlagen, einen Blick auf Boost.Interprocess zu nehmen, die Bedingungen und mutexes hat ...

Aber stellen Sie sicher, dass alle Features auf alle OSes unterstützen Sie unterstützen mögen.

Was Sie sollten über Boost.Interprocess beachten

Überprüfen Sie sorgfältig Maß an Unterstützung für jeden Unix OS müssen Sie mit arbeiten, weil Boost.Interprosess pthread_ * Funktionen verwendet, die nicht immer unterstützt werden ... und dann zur Emulation nicht zurück - überprüfen Sie die Qualität dieser Emulation

Überprüfen Sie auch, wie diese Sachen auf Windows funktioniert - soweit ich weiß, dass es keine „in-Shared-Memory“ ist mutexes in Win32-API, die allgemein benannte Objekte verwendet werden soll, so überprüfen, was unterstützt wird und wie.

Andere Tipps

EDIT: Ich fälschlicherweise dachte, dass Sie unter Thread Synchronisierungs benötigt, Revised für IPC

Ich glaube, Sie so etwas wie wartbar Ereignisse benötigen.

Unter Windows können Sie verwenden CreateEvent() , zu erstellen (oder ein bestehendes erhalten) genannt, auto-Reset-Ereignis.

Beim Prozess A Verarbeitung abgeschlossen ist, sollte es nennen SetEvent() , während Prozess B nennen sollte WaitForSingleObject() schlafen bis zum Abschluss (oder Timeout).

Alternativ können Sie Semaphore verwenden erstellt von CreateSemaphore() , auf 0 initialisiert. Verfahren A-Signale Abschluss durch Aufruf ReleaseSemaphore() , während Prozess B wieder verwendet WaitForSingleObject() für die Fertigstellung zu warten, .

Unter Linux und OS X können Sie Semaphore zu einem ähnlichen Effekt verwenden. verwenden sem_open() erstellen benannt Semaphore, mit 0 als Anfangswert.

Wenn der Prozeß A abgeschlossen ist, sollte es nennen sem_post() die Semaphore zu erhöhen, während Prozess B sem_wait() bis zur Fertigstellung schlafen.

Hinweis : die Semaphore Verfahren kann mehrere Vervollständigungen ermöglichen signalisiert werden, sollten Sie dies umgehen, indem Sie eine maximale Anzahl unter Windows Einstellung oder die aktuelle sem Wert für geistige Gesundheit Überprüfung mit sem_getvalue()


Ich denke, Bedingungsvariablen passen, was Sie, hier ist eine Probe zu tun versuchen, die auf Linux und OSX funktionieren würde

#include <pthread.h>
/* no error checking, quick and dirty sample */
pthread_mutex_t g_mutex;
pthread_cond_t g_cond;
int a_done = 0;

void init(void)
{
    pthread_mutex_init(&g_mutex, NULL);
    pthread_cond_init(&g_cond, NULL);
}

void thread_a(void *arg)
{
    /* do something here... */
    pthread_mutex_lock(&g_mutex);
    a_done = 1;
    pthread_cond_signal(&g_cond);
    pthread_mutex_unlock(&g_mutex);
}

void thread_b(void *arg)
{
    /* wait for a to complete */
    pthread_mutex_lock(&g_mutex);
    while (!a_done)
        pthread_cond_wait(&g_cond, &g_mutex);
    a_done = 0;
    pthread_mutex_unlock(&g_mutex);
}

Unter Windows können Sie verwenden pthreads-win32 oder nativen Zustand Variablen unter Vista finden die MSDN Bedingungsvariablen für weitere Informationen Seite.

Referenzen:

Wenn Ihr O unterstützt Signale Sie einen Mutex von einem Signal-Handler aufschließen konnten und das Signal von Verfahren A, sobald Sie die Aufgabe zu beenden senden.

Prozess B auf einem Mutex oder anderes Synchronisationswerkzeug würde warten und A auf, was arbeiten würde, dann, wenn beispielsweise Oberflächen USR1 Signal sendet, und USR1 Handler in Prozess B entsperrt das entsprechende Synchronisations-Tool.

Die häufigste ist select () / poll () zu verwenden. Beide können mehrere Dateideskriptoren überprüfen, ob es Eingang zur Verfügung. Beide erhalten einen Timeout-Parameter - das busy wait verhindern, die zu 100% CPU verbrauchen kann. Dies ist sehr geeignete Lösung für kleine / mittlere Anwendungen.

Ein weiterer Ansatz ist die Abfrage in separaten Thread zu machen.

Wenn Sie vorhaben, eine große Anwendung zu entwickeln, es lohnt sich schauen in Richtung ACE Rahmen oder steigern . Diese Frameworks sind Cross-Plattform-Lösungen, gut gestaltet und gut getestet.

Nun, meiner Meinung und Erfahrung, die beste Art und Weise zu tun, dass in einer tragbaren und einfachen Art und Weise ist Steckdosen zu verwenden. Plus erhalten Sie die Möglichkeit, die beiden Prozesse auf unterschiedliche Maschine haben (falls erforderlich). Darüber hinaus können Sie die Kommunikation extand mehr zu handhaben als Synchron.

Wenn Sie abfragen wollen einen Thread nicht verwenden, die auf einem Sockel für eine Synchron Nachricht warten. Sie lesen die Buchse in einer blockierenden Art und Weise. Wenn Sie die Meldung erhalten, verwenden Sie eine Standard-Multi-Thread-Synchronisation die Synchronisation zu handhaben. In Ihrem Fall, wie B, bis ein Ende warten soll, müssen Sie nur in einer blockierenden Art und Weise in Ihrem Prozess lesen.

Um den mobilen Einsatz eine tragbare Socket-Bibliothek wie steigern oder ptypes oder was auch immer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top