In den Anfängen von FORTRAN und BASIC wurden im Wesentlichen alle Programme mit GOTO-Anweisungen geschrieben. Das Ergebnis war Spaghetti-Code und die Lösung war strukturierte Programmierung.
In ähnlicher Weise können Zeiger schwierig zu steuernde Merkmale in unseren Programmen haben. C ++ begann mit vielen Zeigern, aber die Verwendung von Referenzen wird empfohlen. Bibliotheken wie STL können einen Teil unserer Abhängigkeit verringern. Es gibt auch Redewendungen zum Erstellen intelligenter Zeiger mit besseren Eigenschaften, und in einigen Versionen von C ++ sind Verweise und verwalteter Code zulässig.
Programmierpraktiken wie Vererbung und Polymorphismus verwenden viele Zeiger hinter den Kulissen (genau wie beim strukturierten Programmieren wird Code mit Verzweigungsanweisungen generiert). Sprachen wie Java eliminieren Zeiger und verwenden Garbage Collection, um dynamisch zugewiesene Daten zu verwalten, anstatt von Programmierern abhängig zu sein, die alle ihre neuen und Löschanweisungen abgleichen.
In meiner Lektüre habe ich Beispiele für Multiprozess- und Multi-Thread-Programmierung gesehen, bei denen keine Semaphore verwendet werden. Verwenden sie dasselbe mit unterschiedlichen Namen oder haben sie neue Möglichkeiten, den Schutz von Ressourcen vor gleichzeitiger Nutzung zu strukturieren?
Ein spezielles Beispiel für ein System zur Multithread-Programmierung mit Multicore-Prozessoren ist beispielsweise OpenMP. Es stellt einen kritischen Bereich wie folgt dar, ohne die Verwendung von Semaphoren, die in der Umgebung nicht enthalten zu sein scheinen.
th_id = omp_get_thread_num();
#pragma omp critical
{
cout << "Hello World from thread " << th_id << '\n';
}
Dieses Beispiel ist ein Auszug aus: http://en.wikipedia.org/wiki/OpenMP
Alternativ könnte ein ähnlicher Schutz von Threads voneinander durch Semaphoren mit den Funktionen wait () und signal () so aussehen:
wait(sem);
th_id = get_thread_num();
cout << "Hello World from thread " << th_id << '\n';
signal(sem);
In diesem Beispiel sind die Dinge ziemlich einfach, und nur eine einfache Überprüfung reicht aus, um zu zeigen, dass wait () - und signal () -Aufrufe übereinstimmen, und selbst bei viel Parallelität wird Threadsicherheit bereitgestellt. Andere Algorithmen sind jedoch komplizierter und verwenden mehrere Semaphore (sowohl binär als auch zählend), die über mehrere Funktionen mit komplexen Bedingungen verteilt sind, die von vielen Threads aufgerufen werden können. Die Folgen eines Deadlocks oder einer fehlgeschlagenen Thread-Sicherung können schwer zu bewältigen sein.
Beseitigen diese Systeme wie OpenMP die Probleme mit Semaphoren?
Bewegen sie das Problem woanders hin?
Wie transformiere ich mein Lieblingssemaphor mithilfe eines Algorithmus, um keine Semaphore mehr zu verwenden?