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

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

Жанры

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

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

Шрифт:

Функция pthread_rwlock_tryrdlock

В листинге 8.5 показана наша реализация функции pthread_rwlock_tryrdlock, которая не вызывает приостановления вызвавшего ее потока.

Листинг 8.5. Функция pthread_rwlock_tryrdlock: попытка заблокировать ресурс для чтения

//my_rwlock/pthread_rwlock_tryrdlock.с

1 #include "unpipc.h"

2 #include "pthread_rwlock.h"

3 int

4 pthread_rwlock_tryrdlock(pthread_rwlock_t *rw)

5 {

6 int result;

7 if (rw->rwjnagic != RW_MAGIC)

8 return(EINVAL);

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

10 return(result);

11 if (rw->rw_refcount < 0 || rw->rw_nwaitwriters > 0)

12 result = EBUSY; /* блокировка установлена пишущим потоком или есть пишущие потоки, ожидающие освобождения ресурса */

13 else

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

15 pthread_mutex_unlock(&rw->rw_mutex);

16 return(result);

17 }

11-14 Если блокировка в данный момент установлена на запись или есть процессы, ожидающие возможности установить ее на запись, возвращается ошибка с кодом EBUSY. В противном случае мы устанавливаем блокировку, увеличивая значение счетчика rw_refcount.

Функция pthread_rwlock_wrlock

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

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

18-19 После получения блокировки на запись мы устанавливаем значение rw_refcount в –1.

Листинг 8.6. Функция pthread_rwlock_wrlock: получение блокировки на запись

//my_rwlock/pthread_rwlock_wrlock.c

1 #include "unpipc.h"

2 #include "pthread_rwlock.h"

3 int

4 pthread_rwlock_wrlock(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 while (rw->rw_refcount != 0) {

12 rw->rw_nwaitwriters++;

13 result = pthread_cond_wait(&rw->rw_condwriters, &rw->rw_mutex);

14 rw->rw_nwaitwriters--;

15 if (result != 0)

16 break;

17 }

18 if (result == 0)

19 rw->rw_refcount = –1;

20 pthread_mutex_unlock(&rw->rw_mutex);

21 return(result);

22 }

Функция pthread_rwlock_trywrlock

Неблокируемая функция pthread_rwlock_trywrlock показана в листинге 8.7.

11-14 Если значение счетчика rw_refcount отлично от нуля, блокировка в данный момент уже установлена считывающим или записывающим процессом (это безразлично) и мы возвращаем ошибку с кодом EBUSY. В противном случае мы устанавливаем блокировку на запись, присвоив переменной rw_refcount значение –1.

Листинг 8.7. Функция pthread_rwlock_trywrlock: попытка получения блокировки на запись

//my_rwlock/pthread_rwlock_trywrlock.c

1 #include "unpipc.h"

2 #include "pthread_rwlock.h"

3 int

4 pthread_rwlock_trywrlock(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 if (rw->rw_refcount != 0)

12 result = EBUSY; /* заблокирован пишущим потоком или ожидающим возможности записи */

13 else

14 rw->rw_refcount = –1; /* доступна */

15 pthread_mutex_unlock(&rw->rw_mutex);

16 return(result);

17 }

Функция pthread_rwlock_unlock

Последняя функция, pthread_rwlock_unlock, приведена в листинге 8.8.

Листинг 8.8. Функция pthread_rwlock_unlock: разблокирование ресурса

//my_rwlock/pthread_rwlock_unlock.c

1 #include "unpipc.h"

2 #include "pthread_rwlock.h"

3 int

4 pthread_rwlock_unlock(pthread_rwlock_t *rw)

5 {

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

Кодекс Крови. Книга ХI

Борзых М.
11. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Кодекс Крови. Книга ХI

Газлайтер. Том 10

Володин Григорий Григорьевич
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Изгой

Майерс Александр
2. Династия
Фантастика:
фэнтези
попаданцы
рпг
аниме
5.00
рейтинг книги
Изгой

Искатель 7

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

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

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

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

Бояръ-Аниме. Газлайтер. Том 34

Володин Григорий Григорьевич
34. История Телепата
Фантастика:
фэнтези
боевая фантастика
аниме
7.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 34

Барон диктует правила

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

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

Я еще царь. Книга XXX

Дрейк Сириус
30. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще царь. Книга XXX

Старый, но крепкий 3

Крынов Макс
3. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 3

Кодекс Охотника. Книга XXXIX

Сапфир Олег
39. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIX

Гром с севера

Мазуров Дмитрий
8. Громовая поступь
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Гром с севера

ЖЛ. Том 6

Шелег Дмитрий Витальевич
6. Живой лед
Фантастика:
фэнтези
городское фэнтези
5.00
рейтинг книги
ЖЛ. Том 6