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

на главную - закладки

Жанры

UNIX: взаимодействие процессов

Стивенс Уильям Ричард

Шрифт:

20-25 Если при инициализации взаимного исключения или условной переменной возникает ошибка, мы аккуратно уничтожаем проинициализированные объекты и возвращаем код ошибки.

Листинг 8.2. Функция pthread_rwlock_init: инициализация блокировки чтения-записи

//my_rwlock/pthread_rwlock_init.с

1 #include "unpipc.h"

2 #include "pthread_rwlock.h"

3 int

4 pthread_rwlock_init(pthread_rwlock_t *rw, pthread_rwlockattr_t *attr)

5 {

6 int result;

7 if (attr != NULL)

8 return(EINVAL); /* not supported */

9 if ((result = pthread_mutex_init(&rw->rw_mutex, NULL)) != 0)

10 goto err1;

11 if ((result = pthread_cond_init(&rw->rw_condreaders, NULL)) != 0)

12 goto err2;

13 if ((result = pthread_cond_init(&rw->rw_condwriters, NULL)) != 0)

14 goto err3;

15 rw->rw_nwaitreaders = 0;

16 rw->rw_nwaitwriters = 0;

17 rw->rw_refcount = 0;

18 rw->rw_magic = RW_MAGIC;

19 return(0);

20 err3:

21 pthread_cond_destroy(&rw->rw_condreaders);

22 err2;

23 pthread_mutex_destroy(&rw->rw_mutex);

24 err1:

25 return(result); /* значение errno */

26 }

Функция pthread_rwlock destroy

В листинге 8.3 приведена функция pthread_rwlock_destroy, уничтожающая блокировку чтения записи после окончания работы с ней.

8-13 Прежде всего проверяется, не используется ли блокировка в данный момент, а затем вызываются соответствующие функции для уничтожения взаимного исключения и двух условных переменных.

Листинг 8.З. Функция pthread_rwlock_destroy: уничтожение блокировки чтения-записи

//my_rwlock/pthread_rwlock_destroy.с

1 #include "unpipc.h"

2 #include "pthread_rwlock.h"

3 int

4 pthread_rwlock_destroy(pthread_rwlock_t *rw)

5 {

6 if (rw->rw_magic != RW_MAGIC)

7 return(EINVAL);

8 if (rw->rw_refcount != 0 ||

9 rw->rw_nwaitreaders != 0 || rw->rw_nwaitwriters != 0)

10 return(EBUSY);

11 pthread_mutex_destroy(&rw->rw_mutex);

12 pthread_cond_destroy(&rw->rw_condreaders);

13 pthread_cond_destroy(&rw->rw_condwriters);

14 rw->rw_magic = 0;

15 return(0);

16 }

Функция pthread_rwlock_rdlock

Текст функции pthread_rwlock_rdlock приведен в листинге 8.4.

Листинг 8.4. Функция pthread_rwlock_rdlock: получение блокировки на чтение

//my_rwlock/pthread_rwlock_rdlock.с

1 #include "unpipc.h"

2 #include "pthread_rwlock.h"

3 int

4 pthread_rwlock_rdlock(pthread_rwlock_t *rw)

5 {

6 int result;

7 if (rw->rw_magic != RW_MAGIC)

8 return(EINVAL);

9 if ((result = pthread_mutex_lock(&rw->rw_mutex)) != 0)

10 return(result);

11 /* предпочтение отдается ожидающим разрешения на запись процессам */

12 while (rw->rw_refcount < 0 || rw->rw_nwaitwriters > 0) {

13 rw->rw_nwaitreaders++;

14 result = pthread_cond_wait(&rw->rw_condreaders, &rw->rw_mutex);

15 rw->rw_nwaitreaders--;

16 if (result != 0)

17 break;

18 }

19 if (result == 0)

20 rw->rw_refcount++; /* блокировка на чтение уже кем-то установлена */

21 pthread_mutex_unlock(&rw->rw_mutex);

22 return (result);

23 }

9-10 При работе со структурой pthread_rwl ock_t всегда устанавливается блокировка на rw_mutex, являющееся ее полем.

11-18 Нельзя получить блокировку на чтение, если rw_refcount имеет отрицательное значение (блокировка установлена на запись) или имеются потоки, ожидающие возможности получения блокировки на запись (rw_nwaitwriters больше 0). Если одно из этих условий верно, мы увеличиваем значение rw_nwaitreaders и вызываем pthread_cond_wait для условной переменной rw_condreaders. Вскоре мы увидим, что при разблокировании ресурса прежде всего проверяется наличие процессов, ожидающих возможности установить блокировку на запись, и если таковых не существует, проверяется наличие ожидающих возможности считывания. Если они имеются, для условной переменной rw_condreaders передается широковещательный сигнал.

19-20 При получении блокировки на чтение мы увеличиваем значение rw_refcount. Блокировка взаимного исключения после этого снимается.

ПРИМЕЧАНИЕ

В этой функции есть проблема: если вызвавший поток будет заблокирован в функции pthread_cond_wait и после этого его выполнение будет отменено, он завершит свою работу, не разблокировав взаимное исключение, и значение rw_nwaitreaders окажется неверным. Та же проблема есть и в функции pthread_rwlock_wrlock в листинге 8.6. Эти проблемы будут исправлены в разделе 8.5.

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

Иной. Том 1. Школа на краю пустыни

Amazerak
1. Иной в голове
Фантастика:
боевая фантастика
рпг
аниме
5.75
рейтинг книги
Иной. Том 1. Школа на краю пустыни

Стражи душ

Кас Маркус
4. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стражи душ

Я уже барон

Дрейк Сириус
2. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я уже барон

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

Девочка из прошлого

Тоцка Тала
3. Айдаровы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девочка из прошлого

Мастер 11

Чащин Валерий
11. Мастер
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер 11

Эволюционер из трущоб

Панарин Антон
1. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб

На границе империй. Том 10. Часть 9

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 9

Локки 9. Потомок бога

Решетов Евгений Валерьевич
9. Локки
Фантастика:
фэнтези
попаданцы
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 9. Потомок бога

Законы Рода. Том 3

Мельник Андрей
3. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 3

Адвокат Империи 4

Карелин Сергей Витальевич
4. Адвокат империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Адвокат Империи 4

Барон меняет правила

Ренгач Евгений
2. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон меняет правила

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Неучтенный элемент. Том 6

NikL
6. Антимаг. Вне системы
Фантастика:
фэнтези
5.25
рейтинг книги
Неучтенный элемент. Том 6