C++: библиотека программиста



Download 1,95 Mb.
Pdf ko'rish
bet84/144
Sana24.02.2022
Hajmi1,95 Mb.
#223123
TuriРеферат
1   ...   80   81   82   83   84   85   86   87   ...   144
Bog'liq
C -Eldjer-Djeff-for-Real-Programmers-RUS-www.itlibitum.ru

 
145 
void 
Rollback() 

if 
(have_image) 

current 

image; 
have_image 

false; 

bool HaveImage() { return have_image; } 
}; 
Если вам захочется еще немного автоматизировать этот шаблон, добавьте вызовы 
Snapshot()
в обе 
операторные функции 
operator=()

Указателей расплодилось слишком много, и терминология начинает запутываться. Термин «указатель 
образов» обозначает указатель, в котором содержится несколько образов объекта (и который почти 
всегда является ведущим), тогда как термин «образы указателей» относится к классу наподобие 
показанного выше, в котором хранится несколько предыдущих значений самого указателя. 
Комбинации и вариации 
В нашей коллекции скопилось уже немало «строительных блоков», а возможности их комбинирования 
безграничны. Выберите по одному варианту в каждой позиции, и вы получите некое 
специализированное решение для работы с образами: 
• 
простые/ведущие указатели; 
• 
образы автоматические/созданные оператором 
new

• 
один образ/стеки образов; 
• 
образы объектов/ образы указателей; 
• 
спонтанное создание образа/ ручной вызов функции 
Snapshot()

Приведенный список ни в коем случае не исчерпывает всех возможных вариантов. Скорее это 
представительный перечень концепций, сосредоточенных вокруг общей темы — управления образами. 
Все концепции ориентированы на С++ с его уникальным синтаксисом и семантикой (в частности
конструкторами и операторами). Пошевелите мозгами и подумайте, как эти концепции подходят к 
вашей конкретной задаче. Именно этим мы и займемся в оставшейся части этой главы. 
Транзакции и отмена 
Решение проблемы транзакций в значительной степени связано с проблемами отмены и 
многопоточных итераторов, поэтому сначала мы поговорим о транзакциях. Итак, мы хотим 
предотвратить обновление некоторого объекта более чем одной транзакцией. Похоже, в решении этой 
задачи нам помогут указатели образов. Давайте посмотрим свежим взглядом на обобщенный указатель 
образов, приведенный в начале главы: 
template  
class ImagePtr { 
private: 
Type* 
current; 
// 
Текущий образ, предоставляемый компоненту 
Type* 
undo; 
// 
Предыдущий образ 
public: 
ImagePtr(); 
ImagePtr(const ImagesPtr& ip); 
~ImagePtr(); 
ImagePtr& operator=(const ImagePtr& ip); 
void 
Snapshot(); 
void 
Commit(); 


 146 
void 
Rollback(); 
Type* 
operator->() 
const; 
}; 
Для мира транзакций придется внести ряд изменений: 
• 
Объект в любой момент времени может быть заблокирован не более чем одной транзакцией. 
• 
Объект не может быть изменен при снятой блокировке. 
• 
Заблокировнный объект может быть измене лишь объектом, который принадлежит транзакции, 
установившей блокировку. 
Следовательно, нам придется создать некоторое представление для транзакции, а заодно — поразмять 
мышцы С++ и построить соответствующую семантику. Транзакции будут представлены классом 
Transaction
. Для блокировок мы воспользуемся специальным обновляющим указателем. Иначе 
говоря, обычные клиенты работают с умным указателем, не допускающим обновления, а клиенты 
транзакции-владельца получают доступ к другому указателю с возможностью обновления. Ниже 
приведена прямолинейная (хотя необязательно самая эффективная) реализация этой архитектуры. 
Позднее мы снимем эти упрощающие ограничения и расширим архитектуру: 
1. Нас интересует только отмена изменений в существующих объектах, а не отмена создания и 
уничтожения объектов в процессе транзакции. 
2. Вопрос о том, когда именно должна устанавливаться блокировка объекта выходит за рамки 
описанной упрощенной архитектуры. 
Транзакции и блокировки 
В действительности транзакция представляет собой нечто иное, чем коллекцию указателей образов, в 
которой имеется несколько функций для перебора. Одна из трудностей состоит в том, что одна 
транзакция может обновлять любое число объектов, относящихся к различным типам. Следовательно, 
класс транзакции должен быть расписан так, чтобы он мог работать с любыми типами — похоже, речь 
идет об абстрактном базовом классе. 
// В файле Transaction.h 
class Lock { 
friend class Transaction; 
protected: 
Transaction* 
transaction; 
// 
Транзакция, которой принадлежит this 
Lock() : transaction(NULL) {} 
void 
RegisterLock(Transaction* 
t) 

if (transaction != NULL) { 
// 
Конфликт – уже имеется другой владелец 
cerr << “Lock::RegisterLock – already locked” << endl; 

else 

t->AddLock(this); 
transaction 

t; 


virtual 
~Lock() 
{} 
virtual void Rollback() = 0; 
virtual void Commit() = 0; 
}; 
class Transaction { 
friend class Lock;
// Чтобы предоставить доступ к AddLock() 



Download 1,95 Mb.

Do'stlaringiz bilan baham:
1   ...   80   81   82   83   84   85   86   87   ...   144




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish