В первые дни 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);
В этом примере все довольно просто, и достаточно простого обзора, чтобы показать, что вызовы wait () и signal () совпадают, и даже при большом параллелизме обеспечивается безопасность потоков. Но другие алгоритмы более сложны и используют несколько семафоров (как двоичных, так и счетных), распределенных по нескольким функциям со сложными условиями, которые могут вызываться многими потоками. Последствиями создания тупиковой ситуации или неспособности обеспечить безопасность потоков может быть трудно справиться.
Устраняют ли такие системы, как OpenMP, проблемы с семафорами?
Перемещают ли они проблему куда-нибудь еще?
Как мне преобразовать мой любимый семафор, используя алгоритм, чтобы больше не использовать семафоры?