Операционные системы. Замятин А.В - 69 стр.

UptoLike

Составители: 

69
Реентерабельный вариант библиотеки glibc написан таким образом,
чтобы реализованные в ней реентерабельные функции как можно
меньше отличались от их обычных аналогов. Также в строке вызова
компилятора могут дополнительно указываться пути для поиска заголо-
вочных файлов (ключ «I») и путь для поиска библиотек (ключ L). Для
компоновщика указывается «l», что программа должна быть связана с
библиотекой libpthread, которая содержит все специальные функции,
необходимые для работы с потоками.
3.1.6. Особенности отладки многопоточной программы
Отладка многопоточной программы сложнее, чем отладка однопо-
точной. Ниже приведены наиболее типичные ошибки исходного кода, ко-
торые могут вызвать ошибки исполнения в многопоточных программах.
1. Доступ к глобальной памяти без использования механизмов
синхронизации.
2. Создание тупиков, вызванных двумя потоками, пробующими
получить права на одну и ту же пару глобальных ресурсов в различном
порядке (один поток управляет одним ресурсом, а второй управляет
другим ресурсом и ни один не может продолжать выполнение до осво-
бождения нужного им ресурса).
3. Попытка повторно получить доступ к уже захваченному ресурсу
(рекурсивный тупик).
4. Создание скрытого промежутка при синхронизации. Это проис-
ходит, когда сегмент кода, защищенный механизмом синхронизации,
содержит вызов функции, которая освобождает и затем повторно созда-
ет механизм синхронизации прежде, чем управление возвращается к
вызывающему потоку. В результате вызывающему «кажется», что гло-
бальные данные были защищены, хотя это не так.
5. Невнимание к тому факту, что потоки по умолчанию создаются
с типом PTHREAD_CREATE_JOINABLE и ресурсы таких потоков долж-
ны быть утилизированы (возвращены родительскому процессу) посред-
ством вызова функции pthread_join. Обратите внимание, что
pthread_exit не освобождает выделенную память.
6. Создание глубоко вложенных, рекурсивных обращений и ис-
пользование больших автоматических массивов может вызвать пробле-
мы, потому что многопоточные программы имеют более ограниченный
размер стека, чем однопоточные.
7. Определение неадекватного размера стека или использование
стека не по умолчанию.