Книга: Программирование для 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() из другой критической секции.

Оглавление книги


Генерация: 1.724. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз