Net framework 5, а также среды Visual Studio 2012 и C#



Download 6,27 Mb.
Pdf ko'rish
bet645/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   641   642   643   644   645   646   647   648   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C

Класс OneManyLock
Я создал собственную конструкцию чтения-записи, работающую быстрее, чем 
встроенный в FCL класс 
ReaderWriterLockSlim
1
. Эта конструкция называется 
1
Код в файле Ch30-1-HybridThreadSync.cs является частью сопроводительного кода 
к данной книге. Вы можете загрузить его с сайта http://Wintellect.com/Books.


869
Гибридные.конструкции.в.FCL
OneManyLock
, так как она предоставляет доступ либо одному пишущему потоку, либо 
нескольким читающим. Данный класс выглядит примерно следующим образом:
public sealed class OneManyLock : IDisposable {
public OneManyLock();
public void Dispose();
public void Enter(Boolean exclusive);
public void Leave();
}
Теперь посмотрим, как это работает. Класс содержит поле типа 
Int32
, предна-
значенное для хранения состояния блокирования, объект 
Semaphore
, блокирующий 
читающие потоки, и объект 
AutoResetEvent
, блокирующий пишущие потоки. Поле 
записи состояния содержит в себе пять вложенных полей.
‰
Четыре бита представляют состояние блокировки. Значение 0 означает 
Free
(до-
ступно), 1 — 
OwnedByWriter
(занято записывающим потоком), 2 — 
OwnedByReaders
(занято читающими потоками), 3 — 
OwnedByReadersAndWriterPending
(занято 
записывающим и читающими потоками) и 4 — 
ReservedForWriter
(зарезерви-
ровано для записывающего потока). Другие значения не используются.
‰
Двадцать битов (число от 0 до 1048575) представляют количество потоков чтения 
(RR), допустимых для блокировки.
‰
Двадцать битов представляют количество потоков чтения (RW), ожидающих 
получения блокировки. Эти потоки удерживает объект 
AutoResetEvent
.
‰
Двадцать битов представляют количество потоков записи (WW), ожидающих 
получения блокировки. Эти потоки удерживает объект 
Semaphore
.
Теперь, когда вся информация о блокировании сконцентрирована в одном поле 
типа 
Int64
, я могу управлять этим полем при помощи методов класса 
Interlocked

В результате блокирование выполняется очень быстро и приводит к блокированию 
потока только при конкуренции потоков.
Вот что происходит при входе потока в код блокирования совместного досту-
па:
‰
Если блокирование возможно, присваиваем состоянию значение 
OwnedByReaders

выполняем 
RR = 1
, возвращаем управление.
‰
Если состояние блокирования имеет значение 
OwnedByReaders
(занято потоком 
чтения), выполняем 
RR++
, возвращаем управление.
‰
В противном случае выполняем 
RW++
, блокируем поток чтения. Когда поток 
проснется, проходим цикл и делаем вторую попытку.
Вот что происходит при выходе потока из кода блокировки совместного до-
ступа:
‰
Выполняем 
RR--
.


870
Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   641   642   643   644   645   646   647   648   ...   658




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