Книга: Программирование для Linux. Профессиональный подход
Листинг 4.6. (critical_section.c) Защита банковской транзакции с помощью критической секции
Листинг 4.6. (critical_section.c) Защита банковской транзакции с помощью критической секции
#include <pthread.h>
#include <stdio.h>
#include <string.h>
/* Массив балансов счетов, упорядоченный по номеру счета. */
float* account_balances;
/* перевод денежной суммы, равной параметру DOLLARS, со счета
FROM_ACCT на счет TO_ACCT. Возвращается 0, если транзакция
завершена успешно, или 1, если баланс счета FROM_ACCT
слишком мал. */
int process_transaction(int from_acct, int to_acct,
float dollars) {
int old_cancel_state;
/* Проверяем баланс на счету FROM_ACCT. */
if (account_balances(from_acct) < dollars)
return 1;
/* Начало критической секции. */
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancel_state);
/* переводим деньги. */
account_balances[to_acct] += dollars;
account_balances[from_acct] -= dollars;
/* Конец критической секции. */
pthread_setcancelstate(old_cancel_state, NULL);
return 0;
}
Обратите внимание на то, что по окончании критической секции восстанавливается предыдущее состояние потока, а не режим PTHREAD_CANCEL_ENABLE
. Это позволит безопасно вызывать функцию process_transaction()
из другой критической секции.
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Повышение производительности приложений с помощью хранимых процедур
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Организация пользователей в группы с помощью ролей
- Раздел VII Левиафан в Сети: защита права на тайну частной жизни после событий 2013 г.
- 10.5. Транзакции и пути доступа меню
- Листинг 15.11. Код для загрузки файла с Web-сервера
- Глава 2 Нарушение и защита информационных систем
- Глава 4 Защита информации в компьютерных системах
- Часть II Защита электронной почты
- Обработка запросов с помощью PHP
- Как с помощью компьютера подшутить над друзьями и коллегами?