Na początku FORTRAN i BASIC zasadniczo wszystkie programy były pisane przy pomocy instrukcji GOTO. W rezultacie powstał kod spaghetti, a rozwiązaniem było ustrukturyzowane programowanie.
Podobnie wskaźniki mogą mieć trudne do kontrolowania cechy w naszych programach. C ++ zaczęło się od wielu wskaźników, ale zalecane jest użycie referencji. Biblioteki takie jak STL mogą zmniejszyć część naszej zależności. Istnieją również idiomy do tworzenia inteligentnych wskaźników, które mają lepszą charakterystykę, a niektóre wersje C ++ pozwalają na odwołania i kod zarządzany.
Praktyki programowania, takie jak dziedziczenie i polimorfizm, wykorzystują wiele wskazówek za kulisami (tak jak w przypadku, gdy programowanie strukturalne generuje kod wypełniony instrukcjami rozgałęzienia). Języki takie jak Java eliminują wskaźniki i używają funkcji wyrzucania elementów bezużytecznych do zarządzania dynamicznie przydzielanymi danymi zamiast polegać na programistach w celu dopasowania wszystkich swoich nowych instrukcji usuwania i usuwania.
W swoim czytaniu widziałem przykłady programowania wieloprocesowego i wielowątkowego, które nie wykorzystują semaforów. Czy używają tego samego pod różnymi nazwami, czy też mają nowe sposoby strukturyzacji ochrony zasobów przed jednoczesnym użyciem?
Na przykład konkretnym przykładem systemu do programowania wielowątkowego z procesorami wielordzeniowymi jest OpenMP. Reprezentuje region krytyczny w następujący sposób, bez użycia semaforów, które wydają się nie być zawarte w środowisku.
th_id = omp_get_thread_num();
#pragma omp critical
{
cout << "Hello World from thread " << th_id << '\n';
}
Ten przykład jest fragmentem: http://en.wikipedia.org/wiki/OpenMP
Alternatywnie, podobna ochrona wątków przed sobą za pomocą semaforów z funkcjami wait () i signal () może wyglądać następująco:
wait(sem);
th_id = get_thread_num();
cout << "Hello World from thread " << th_id << '\n';
signal(sem);
W tym przykładzie rzeczy są dość proste i wystarczy prosta recenzja, aby pokazać, że połączenia wait () i signal () są dopasowane, a nawet przy dużej współbieżności zapewnione jest bezpieczeństwo wątków. Ale inne algorytmy są bardziej skomplikowane i wykorzystują wiele semaforów (zarówno binarnych, jak i zliczających) rozmieszczonych w wielu funkcjach ze złożonymi warunkami, które mogą być wywoływane przez wiele wątków. Trudno poradzić sobie z konsekwencjami tworzenia impasu lub braku zapewnienia bezpieczeństwa wątków.
Czy takie systemy jak OpenMP eliminują problemy z semaforami?
Czy przenoszą problem gdzieś indziej?
Jak przekształcić mój ulubiony semafor za pomocą algorytmu, aby nie używać już semaforów?