Архитектура современных операционных систем
52 Захват мютекса осуществляется с помощью pthread_mutex_lock, а осво- бождение с помощью pthread_mutex_unlock. Поток, попытавшийся захватить уже захваченный mutex, переводится в ожидание, пока мютекс не будет освобожден. Переменные состояния создаются с помощью функции pthread_cond_init, а уничтожаются с помощью pthread_cond_destroy. Переменные состояния могут принимать 2 значения: установлено; сброшено. Поток может перейти в состояние ожидания установки переменных со- стояния, с помощью функции pthread_cond_wait, и будет, находится в ожида- нии до тех пор, пока другой поток не установит ожидаемую переменную состо- яния, с помощью функции pthread_cond_signal. Поскольку UNIX создавалась ориентированной на процессы, при реали- зации в ней многопоточности возникает ряд вопросов: 1) Как должен выполняться вызов fork? Должен ли он создавать все су- ществующие в родительском процессе потоки? Если нет, то, какие? Если да, то может возникнуть следующая ситуация. В родительском процессе на момент вызова fork есть поток, ожидающий ввода с клавиатуры. Такой же поток после fork появится и в дочернем процессе. Кто из них получит символы с клавиату- ры после того, как потоки будут разблокированы? 2) В UNIX можно посылать сигналы процессам. Какой поток будет при- нимать сигнал в случае многопоточности? 3) После игнорирования сигнала SIGTERM «убивать» надо только отка- завшийся поток или все потоки процесса? Стандарт POSIX пока четких ответов на эти вопросы не дает.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTY0OTYy