Чтение онлайн

на главную

Жанры

Основы программирования в Linux
Шрифт:

int pthread_mutex_destroy(pthread_mutex_t *mutex);

Как обычно, в случае успешного завершения возвращается 0 и код ошибки в случае аварийного завершения, но переменная

errno
не задается, вам придется использовать код возврата.

Как и функции семафоров, функции мьютексов принимают указатель на предварительно объявленный объект, в данном случае типа

pthread_mutex_t
. Дополнительный параметр атрибутов в функции
pthread_mutex_init
позволяет задать атрибуты мьютекса, управляющие его поведением. По умолчанию тип атрибута — "fast". У него есть небольшой недостаток: если
ваша программа попытается вызвать функцию
pthread_mutex_lock
для мьютекса, который уже заблокирован, программа блокируется. Поскольку поток, удерживающий блокировку, в данный момент заблокирован, мьютекс никогда не будет открыт, и программа попадает в тупиковую ситуацию. Есть возможность изменить атрибуты мьютекса так, чтобы он либо проверял наличие такой ситуации и возвращал ошибку, либо действовал рекурсивно и разрешал множественные блокировки тем же самым потоком, если будет такое же количество разблокировок в дальнейшем.

Установка атрибутов мьютекса в этой книге не рассматривается, поэтому мы будем передавать

NULL
в указателе на атрибуты, и использовать поведение по умолчанию. Дополнительную информацию об изменении атрибутов можно найти в интерактивном справочном руководстве к функции
pthread_mutex_init
.

Выполните упражнение 12.4. 

Упражнение 12.4. Мьютекс потока

Далее приводится еще одна модификация исходной программы thread1.с, но значительно измененная. На этот раз вы уделите особое внимание доступу к вашим важным переменным и примените мьютекс для того, чтобы быть уверенными в том, что они доступны в любой момент времени только одному потоку. Для легкости чтения текста примера мы пропустили некоторые проверки ошибок при возвратах из мьютекса, заблокированного и открытого. В рабочем программном коде вы обязательно должны проверять эти возвращаемые значения. Далее приведен текст новой программы thread4.c.

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <pthread.h>

#include <semaphore.h>

void *thread_function(void *arg);

pthread_mutex_t work_mutex; /* защищает work_area и time_to_exit */

#define WORK_SIZE 1024

char work_area[WORK_SIZE];

int time_to_exit = 0;

int main {

 int res;

 pthread_t a_thread;

 void *thread_result;

 res = pthread_mutex_init(&work_mutex, NULL);

 if (res != 0) {

perror("Mutex initialization failed");

exit(EXIT_FAILURE);

 }

 res pthread_create(&a_thread, NULL, thread_function, NULL);

 if (res != 0) {

perror("Thread creation failed");

exit(EXIT_FAILURE);

 }

 pthread_mutex_lock(&work_mutex);

 printf("Input same text. Enter 'end' to finish\n");

 while (!time_to_exit) {

fgets (work_area, WORK_SIZE, stdin);

pthread_mutex_unlock(&work_mutex);

while(1) {

pthread_mutex_lock(&work_mutex);

if (work_area[0] != '\0') {

pthread_mutex_unlock(&work_mutex);

sleep(1);

} else {

break;

}

}

 }

 pthread_mutex_unlock(&work_mutex);

 printf("\nWaiting for thread to finish...\n");

 res = pthread_join(a_thread, &thread_result);

 if (res ! = 0) {

perror("Thread join failed");

exit(EXIT_FAILURE);

 }

 printf("Thread joined\n");

 pthread_mutex_destroy(&work_mutex);

 exit(EXIT_SUCCESS);

}

void *thread_function(void *arg) {

 sleep(1);

 pthread_mutex_lock(&work_mutex);

 while(strncmp("end", work_area, 3) ! = 0) {

printf("You input %d characters\n", strlen(work_area)-1);

work_area[0] = '\0';

pthread_mutex_unlock(&work_mutex);

sleep(1);

pthread_mutex_lock(&work_mutex);

while (work_area[0] == '\0') {

pthread_mutex_unlock(&work_mutex);

sleep(1);

pthread_mutex_lock(&work_mutex);

}

 }

 time_to_exit = 1;

 work_area[0] = '\0';

 pthread_mutex_unlock(&work_mutex);

 pthread_exit(0);

}

После

запуска вы получите следующий вывод:

$ cc -D_REENTRANT thread4.с -о thread4 -lpthread

$ ./thread4

Input some text. Enter 'end' to finish

Whit

You input 4 characters

The Crow Road

You input 13 characters

end

Waiting for thread to finish...

Thread joined

Как это работает

Вы начинаете с объявления мьютекса вашей рабочей области и на сей раз дополнительной переменной

time_to_exit
:

Поделиться:
Популярные книги

Оружейникъ

Кулаков Алексей Иванович
2. Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Оружейникъ

Отверженный VII: Долг

Опсокополос Алексис
7. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Отверженный VII: Долг

Аномальный наследник. Том 4

Тарс Элиан
3. Аномальный наследник
Фантастика:
фэнтези
7.33
рейтинг книги
Аномальный наследник. Том 4

Искушение генерала драконов

Лунёва Мария
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Искушение генерала драконов

Имперец. Том 5

Романов Михаил Яковлевич
4. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Имперец. Том 5

Всадники бедствия

Мантикор Артемис
8. Покоривший СТЕНУ
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Всадники бедствия

Курсант: назад в СССР 9

Дамиров Рафаэль
9. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: назад в СССР 9

Архил...? Книга 2

Кожевников Павел
2. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Архил...? Книга 2

Довлатов. Сонный лекарь 2

Голд Джон
2. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь 2

Последний Паладин. Том 3

Саваровский Роман
3. Путь Паладина
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 3

Попаданка в деле, или Ваш любимый доктор - 2

Марей Соня
2. Попаданка в деле, или Ваш любимый доктор
Любовные романы:
любовно-фантастические романы
7.43
рейтинг книги
Попаданка в деле, или Ваш любимый доктор - 2

Алекс и Алекс

Афанасьев Семен
1. Алекс и Алекс
Фантастика:
боевая фантастика
6.83
рейтинг книги
Алекс и Алекс

Бастард Императора. Том 6

Орлов Андрей Юрьевич
6. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 6

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...