_SC_THREAD_PROCESS_SHARED _POSIX_THREAD_PROCESS_SHARED Поддерживает синхронизацию на уровне процесса
_SC_THREAD_SAFE_ FUNCTIONS _POSIX_THREAD_SAFE_FUNCTIONS Поддерживает функции безопасности потока
_SC_THREAD_ DESTRUCTOR_ ITERATIONS _PTHREAD_THREAD_DESTRUCTOR_ITERATIONS Определяет количество попыток, направленных на разрушение потоковых данных при завершении потока
_SC_CHILD_MAX CHILD_MAX Максимальное количество процессов, разрешенных для UID
_SC_PRIORITY_ SCHEDULING _POSIX_PRIORITY_ SCHEDULING Поддерживает планирование процессов
_SC_REALTIME_ SIGNALS _POSIX_REALTIME_SIGNALS Поддерживает сигналы реального времени
_SC_XOPEN_REALTIME_THREADS _XOPEN_REALTIME_ THREADS Поддерживает группу потоковых средств реального времени X/Open POSIX
_SC_STREAM_MAX STREAM_MAX Определяет количество потоков данных, которые один процесс может открыть одновременно
_SC_SEMAPHORES _POSIX_SEMAPHORES Поддерживает семафоры
_SC_SEM_NSEMS_MAX SEM_NSEMS_MAX Определяет максимальное количество семафоров, которое может иметь процесс
_SC_SEM_VALUE_MAX SEM_VALUE_MAX Определяет максимальное значение, которое может иметь семафор
_SC_SHARED_MEMORY_ OBJECTS _POSIX_SHARED_MEMORY_OBJECTS Поддерживает объекты общей памяти

Управление критическими разделами

Параллельно выполняемые процессы (или потоки в одном процессе) могут совместно использовать структуры данных, переменные или отдельные данные. Разделение глобальной памяти позволяет процессам или потокам взаимодействовать друг с другом и получать доступ к общим данным. При использовании нескольких процессов разделяемая глобальная память является внешней по отношению к ним. Внешнюю структуру данных можно использовать для передачи данных или команд между процессами. Если же необходимо организовать взаимодействие потоков, то они могут иметь доступ к структурам данных или переменным, являющимся частью одного и того же процесса, которому они принадлежат.

Если существуют процессы или потоки, которые получают доступ к разделяемым модифицируемым данным, структурам данных или переменным, то все эти данные находятся в критической области (или разделе) кода процессов или потоков. Критический раздел кода — это та его часть, в которой обеспечивается доступ потока или процесса к разделяемому блоку модифицируемой памяти и обработка соответствующих данных. Отнесение раздела кода к критическому можно использовать для управления состоянием «гонок». Например, создаваемые в программе два потока, поток А и поток В, используются для поиска нескольких ключевых слов во всех файлах системы. Поток А просматривает текстовые файлы в каждом каталоге и записывает нужные пути в списочную структуру данных TextFiles, а затем инкрементирует переменную FileCount. Поток В выделяет имена файлов из списка TextFiles, декрементирует переменную FileCount, после чего просматривает файл на предмет поиска в нем заданных ключевых слов. Файл, который их содержит, переписывается в другой файл, и инкрементируется еще одна переменная FoundCount. К переменной FoundCount поток А доступа не имеет. Потоки А и В могут выполняться одновременно на отдельных процессорах. Поток А выполняется до тех пор, пока не будут просмотрены все каталоги, в то время как поток В просматривает каждый файл, путь к которому выделен из переменной TextFiles. Упомянутый список поддерживается в отсортированном порядке, и в любой момент его содержимое можно отобразить на экране.

Здесь возможна масса проблем. Например, поток В может попытаться выделить имя файла из списка TextFiles до того, как поток А его туда поместит. Поток В может попытаться декрементировать переменную SearchCount до того, как поток А её инкрементирует, или же оба потока могут попытаться модифицировать эту переменную одновременно. Кроме того, во время сортировки элементов списка TextFiles поток А может попытаться записать в него имя файла, или поток В будет в это время пытаться выделить из него имя файла для выполнения своей задачи.

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату