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



Download 6,27 Mb.
Pdf ko'rish
bet621/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   617   618   619   620   621   622   623   624   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C


Глава.29 .Примитивные.конструкции.синхронизации.потоков
Теперь, когда вы получили представление о том, что происходит, посмотрим, 
как это работает. Класс 
AsyncCoordinator
содержит всю логику координации по-
токов. Во всех случаях он использует методы 
Interlocked
, гарантируя быстрое 
выполнение кода и отсутствие блокировки потоков. Вот код этого класса:
internal sealed class AsyncCoordinator {
private Int32 m_opCount = 1; // Уменьшается на 1 методом AllBegun
private Int32 m_statusReported = 0; // 0=false, 1=true
private Action m_callback;
private Timer m_timer;
// Этот метод ДОЛЖЕН быть вызван ДО инициирования операции
public void AboutToBegin(Int32 opsToAdd = 1) {
Interlocked.Add(ref m_opCount, opsToAdd);
}
// Этот метод ДОЛЖЕН быть вызван ПОСЛЕ обработки результата
public void JustEnded() {
if (Interlocked.Decrement(ref m_opCount) == 0)
ReportStatus(CoordinationStatus.AllDone);
}
// Этот метод ДОЛЖЕН быть вызван ПОСЛЕ инициирования ВСЕХ операций
public void AllBegun(Action callback,
Int32 timeout = Timeout.Infinite) {
m_callback = callback;
if (timeout != Timeout.Infinite)
m_timer = new Timer(TimeExpired, null, timeout, Timeout.Infinite);
JustEnded();
}
private void TimeExpired(Object o) {
ReportStatus(CoordinationStatus.Timeout); 
}
public void Cancel() { ReportStatus(CoordinationStatus.Cancel); }
private void ReportStatus(CoordinationStatus status) {
// Если состояние ни разу не передавалось, передать его; 
// в противном случае оно игнорируется
if (Interlocked.Exchange(ref m_statusReported, 1) == 0)
m_callback(status);
}
}
Самым важным в этом классе является поле 
m_opCount
. В нем отслеживается 
количество асинхронных операций, ожидающих выполнения. Перед началом каждой 
такой операции вызывается метод 
AboutToBegin
. Он вызывает метод 
Interlocked.
Add
, чтобы атомарно добавить к полю 
m_opCount
переданное в него число. Операция 
суммирования должна осуществляться атомарно, так как веб-серверы могут отвечать 
потокам пула в процессе начала дополнительных операций. При каждом ответе 


837
Конструкции.пользовательского.режима
сервера вызывается метод 
JustEnded
. Он вызывает метод 
Interlocked.Decrement
и атомарно вычитает из переменной 
m_opCount
единицу. Поток, присвоивший пере-
менной 
m_opCount
значение 0, вызывает метод 
ReportStatus
.

Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   617   618   619   620   621   622   623   624   ...   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