На початку FORTRAN та BASIC фактично всі програми були написані з заявами GOTO. Результатом став код спагетті, а рішення - структуроване програмування.
Аналогічно, покажчики можуть мати труднощі з управління характеристиками в наших програмах. C ++ розпочався з великою кількістю покажчиків, але рекомендується використовувати посилання. Бібліотеки, такі як STL, можуть зменшити частину нашої залежності. Існують також ідіоми для створення розумних покажчиків, які мають кращі характеристики, а деякі версії C ++ дозволяють посилатися та керувати кодом.
Практики програмування, такі як успадкування та поліморфізм, використовують безліч покажчиків за кадром (так само, як і в той час, як структуроване програмування генерує код, заповнений інструкціями гілки). Такі мови, як Java, усувають покажчики та використовують збирання сміття для управління динамічно виділеними даними, а не залежно від програмістів, щоб відповідати усім їх новим та видаляти операторам.
У своєму читанні я побачив приклади багатопроцесового та багатопотокового програмування, які, здається, не використовують семафори. Чи вони використовують одне й те саме з різними назвами чи мають нові способи структурування захисту ресурсів від одночасного використання?
Наприклад, конкретним прикладом системи для багатопотокового програмування з багатоядерними процесорами є OpenMP. Він представляє критичну область наступним чином, без використання семафорів, які, здається, не включаються до середовища.
th_id = omp_get_thread_num();
#pragma omp critical
{
cout << "Hello World from thread " << th_id << '\n';
}
Цей приклад - уривок з: http://en.wikipedia.org/wiki/OpenMP
Крім того, подібний захист потоків один від одного за допомогою семафорів з функціями wait () і signal () може виглядати так:
wait(sem);
th_id = get_thread_num();
cout << "Hello World from thread " << th_id << '\n';
signal(sem);
У цьому прикладі речі досить прості, і достатньо простого огляду, щоб показати дзвінки очікування () та сигналу (), які відповідають і навіть з великою сукупністю, забезпечується безпека потоку. Але інші алгоритми є більш складними і використовують кілька семафорів (як двійкових, так і лічильних), розподілених по декількох функціях зі складними умовами, які можна назвати багатьма потоками. Наслідки створення глухого кута або невдало забезпечити безпеку речей можуть бути важкими для управління.
Чи усувають такі системи, як OpenMP, проблеми з семафорами?
Вони переносять проблему кудись інше?
Як перетворити свій улюблений семафор за допомогою алгоритму, щоб більше не використовувати семафори?