OperationSystems
.pdfint pthread_mutex_init (pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
Аргументы:
•mutex – пустая переменная (или уничтоженный флаг), которая будет инициализирована для последующего использования;
•attr – атрибуты создаваемого мьютекса (если NULL – атрибуты по умолчанию).
Функция для удаления мьютекса. После удаления он не может быть использован. Удалять заблокированные мьютексы не рекомендуется – в таких случаях дальнейшее поведение и результат работы программы становятся непредсказуемыми.
int pthread_mutex_destroy(pthread_mutex_t *mutex);
Аргументы:
•mutex – жертва функции, мьютекс, который будет уничтожен.
Функция для перевода мьютекса в заблокированное состояние. Если мьютекс уже заблокирован, то выполнение кода приостанавливается до тех пор, пока мьютекс не будет разблокирован и функция не сможет нормально отработать.
int pthread_mutex_lock(pthread_mutex_t *mutex);
Аргументы:
•mutex – блокируемый мьютекс.
Функция, освобождающая мьютекс. Мьютекс должен быть в заблокированном состоянии.
int pthread_mutex_unlock(pthread_mutex_t *mutex);
Аргументы:
•mutex – разблокируемый мьютекс.
Функция, пытающаяся захватить мьютекс, вызывающий поток ждет некоторое время и, если мьютекс недоступен, продолжает работу без захвата.
int pthread_mutex_trylock ((pthread_mutex_t *__mutex));
Аргументы:
•mutex – мьютекс, который пытается захватить поток.
3.4.2.Семафор
Функция для инициализации семафора.
int sem_init ((sem_t *__sem, int __pshared, unsigned int __value));
Аргументы:
•sem – инициализированный объект;
• pshared – если отличен от нуля, то семафор разделяется между процессами, в противном случае разделение возможно только между потоками управления вызывающего процесса;
•value – начальное значение создаваемого неименованного семафора.
Функция для освобождения ресурсов, связанных с объектом семафора.
int sem_destroy ((sem_t *__sem));
Аргументы:
•sem – семафор.
Функция, уменьшающая на 1 текущее значение общего семафора на
идентификатор которого указывает аргумент sem. Если прежнее значение семафора было 0, поток, выполняющий фиункцию sem_wait блокируется до изменения значения семафора.
int sem_wait ((sem_t *__sem));
Аргументы:
•sem – семафор.
Функция, проверяющая равен ли семафор 0, если равен, то уменьшает его на единицу.
int sem_trywait ((sem_t *__sem));
Аргументы:
•sem – семафор.
Функция, увеличивающая на 1 текущее значение общего семафора на
идентификатор которого указывает аргумент sem. Если прежнее значение семафора было 0 и есть потоки, заблокированные в своей операции sem_wait, один из них разблокируется, но который именно – не определено.
int sem_post ((sem_t *__sem));
Аргументы:
•sem – семафор.
Функция, записывающая текущее значение общего семафора, на идентификатор которого указывает аргумент sem по адресу, задаваемому аргументом sval.
int sem_getvalue ((sem_t *__sem, int *__sval));
Аргументы:
•sem – семафор;
•sval – адрес, по которому сохраняет текущее значение семафора.
3.5.Тривиальный пример организации потоков
myfunc()
{
* * *
//выполняем задание, // если нужно --- читаем данные по адресу в аргументе
* * *
return return_value;
}
main()
{
* * *
//что-то делаем
* * *
pthread_create(...,myfunc,...)
//не забываем запомнить идентификатор
* * *
//что-то делаем
* * *
pthread_join(&return_value)
// если нужно – анализируем выходное значение
* * *
}
2.Задания на лабораторные работы
2.1. Лабораторная работа #1
Разработка многопоточного приложения в ОС Windows.
Выбрать граф запуска потоков соответственно варианту задания. Реализовать последовательно-параллельный запуск потоков в ОС Windows с использованием средств синхронизации. Вершины графа – точки запуска/завершения потоков, дуги – потоки. В графе необходимо самостоятельно выделить три группы потоков. Первая группа не синхронизирована, вторая – синхронизирована мьютексом (захватывает мьютекс на время выполнения), третья – синхронизирована семафорами (передает управление другому потоку после каждой итерации).
2.2. Лабораторная работа #2
Разработка многопоточного приложения средствами POSIX.
Соответственно графу запуска потоков, использованному в предыдущей лабораторной работе, реализовать последовательно-параллельный запуск потоков в ОС Linux с использованием средств синхронизации. В графе необходимо самостоятельно выделить три группы потоков. Первая группа не синхронизирована, вторая – синхронизирована мьютексом (захватывает мьютекс на время выполнения), третья – синхронизирована семафорами (передает управление другому потоку после каждой итерации). В данной лабораторной работе используется библиотека Libpthreads.
3.Требования к оформлению отчетов
–Титульный лист;
–Задание на лабораторную работу;
–Граф запуска потоков;
–Листинг;
–Выводы по проделанной работе.
4.Варианты графов запуска потоков
№ |
Граф запуска потоков |
варианта |
|
|
|
1 |
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
