Ich habe eine Logik in einer dynamischen Bibliothek, die einen Dienst ausführt, der von der Hauptprogrammdatei angefordert wird.Wie man vermeidet, auf pthread_cond_t zu warten, wo das Signal bereits gesendet wurde
Wenn Sie aus dem Bibliothekscode start_service
anrufen, müssen einige Vorbereitungen getroffen werden, bevor der Dienst betriebsbereit ist. Während dieser Zeit sollte der Hauptcode nicht versuchen, auf den Dienst zuzugreifen.
Um den Hauptcode zu benachrichtigen, wenn der Dienst bereit ist, verwende ich bedingte Variable und signalisiere die Hauptdatei.
Ich möchte einige Ratschläge über die beste Möglichkeit, eine Situation zu behandeln, wenn die Bibliothek vor dem Haupt-Code warten auf die bedingte Variable zu behandeln. in diesem Fall kann die Warte ewig dauern ...
hier ist der Service-Code:
extern pthread_cond_t cnd;
extern pthread_mutex_t mtx;
void start_service()
{
// getting serviceable.
pthread_cond_signal(&cnd);
main_loop();
}
Und hier ist der Hauptcode.
pthread_cond_t cnd;
pthread_mutex_t mtx;
int main()
{
pthread_cond_init(&cnd,NULL);
pthread_mutex_init(&mtx, NULL);
std::thread mytrd(&start_service);
...
pthread_mutex_lock(&mtx);
pthread_cond_wait(&cnd, &mtx); // what happens if we get here after the signal already sent.
pthread_mutex_unlock(&mtx);
...
}
P.S das gewünschte Verhalten sollte sein, dass die Haupt-Code zu vermeiden für die bedingte Variable warten, wenn es bereits signalisiert hat.
Sie können eine Semaphore mit anfänglicher Anzahl von '0' verwenden, so Haupt blockiert wird, bis 'start_service()' Erhöhung Semaphore Zahl auf '1'.If vor dem Bausteinaufruf im Haupt,' start_service() 'erhöht die Semaphorzahl auf' 1', main wird niemals in den Wartezustand gehen. –
hi und danke für deinen Kommentar, es scheint wie ein passender Weg .. vielleicht kannst du meinen Code ändern, um deine Idee auszudrücken? – Zohar81
pthread_wait ** muss immer ** in einer Schleife verwendet werden, die die Bedingung hat, auf die sie wartet. Keine Schleife zu verwenden ist eine schlechte Übung, sie kann jederzeit fehlschlagen. – geza