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



Download 6,27 Mb.
Pdf ko'rish
bet628/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   624   625   626   627   628   629   630   631   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C

Конструкции режима ядра
Для синхронизации потоков в Windows существует несколько конструкций режима 
ядра. Они работают намного медленнее конструкций пользовательского режима, 
так как требуют координации со стороны операционной системы. Кроме того, 
каждый вызов метода для объекта ядра заставляет вызывающий поток перейти из 
управляемого в машинный код, затем в код режима ядра, после чего возвращается 
назад. Такие переходы требуют много процессорного времени и их частое выпол-
нение значительно снижает производительность приложения.
Впрочем, у конструкций режима ядра есть и свои преимущества перед конструк-
циями пользовательского режима:
‰
Если конструкция режима ядра выявляет конкуренцию за ресурс, Windows 
блокирует проигравший поток, останавливая зацикливание, которое ведет к на-
прасному расходованию ресурсов процессора.
‰
Конструкции режима ядра могут осуществлять взаимную синхронизацию не-
управляемых и управляемых потоков.
‰
Конструкции режима ядра умеют синхронизировать потоки различных про-
цессов, запущенных на одной машине.
‰
Конструкции режима ядра можно наделить атрибутами безопасности, ограни-
чивая несанкционированный доступ к ним.
‰
Поток можно заблокировать, пока не станут доступны все конструкции режима 
ядра или пока не станет доступна хотя бы одна такая конструкция.
‰
Поток можно заблокировать конструкцией режима ядра, указав время ожидания; 
если за указанное время поток не получит доступа к нужному ему ресурсу, он 
будет разблокирован и сможет выполнять другие задания.
К примитивным конструкциям синхронизации потоков в режиме ядра от-
носятся 
события
(events) и 
семафоры
(semaphores). На их основе строятся 


844
Глава.29 .Примитивные.конструкции.синхронизации.потоков
более сложные конструкции аналогичного назначения, например 
мьютексы
(mutex). Более полную информацию о них вы найдете в моей книге «Windows via
C/C++» (Microsoft Press, 2007).
В пространстве имен 
System.Threading
существует абстрактный базовый класс 
WaitHandle
. Он играет роль оболочки для дескриптора ядра Windows. В FCL име-
ется несколько производных от него классов. Все они определены в пространстве 
имен 
System.Threading
и реализуются библиотекой 
MSCorLib dll
. Исключением 
является класс 
Semaphore
, реализованный в библиотеке 
System dll
. Вот как вы-
глядит иерархия этих классов:
WaitHandle
EventWaitHandle
AutoResetEvent
ManualResetEvent
Semaphore
Mutex
В базовом классе 
WaitHandle
имеется поле 
SafeWaitHandle
, содержащее де-
скриптор ядра Win32. Это поле инициализируется в момент создания класса, про-
изводного от 
WaitHandle
. Кроме того, класс 
WaitHandle
предоставляет открытые 
методы, которые наследуются всеми производными классами. Каждый из вызыва-
емых конструкциями режима ядра методов обеспечивает полную защиту памяти. 
Вот наиболее интересные открытые методы класса 
WaitHandle
(перегруженные 
версии некоторых методов не показаны):
public abstract class WaitHandle : MarshalByRefObject, IDisposable { 
// Реализация WaitOne вызывает функцию Win32 WaitForSingleObjectEx.
public virtual Boolean WaitOne(); 
public virtual Boolean WaitOne(Int32 millisecondsTimeout); 
public virtual Boolean WaitOne(TimeSpan timeout); 
// Реализация WaitAll вызывает функцию Win32 WaitForMultipleObjectsEx
public static Boolean WaitAll(WaitHandle[] waitHandles); 
public static Boolean WaitAll(WaitHandle[] waitHandles, 
Int32 millisecondsTimeout); 
public static Boolean WaitAll(WaitHandle[] waitHandles, TimeSpan timeout); 
// Реализация WaitAny вызывает функцию Win32 WaitForMultipleObjectsEx
public static Int32 WaitAny(WaitHandle[] waitHandles); 
public static Int32 WaitAny(WaitHandle[] waitHandles, 
Int32 millisecondsTimeout);
public static Int32 WaitAny(WaitHandle[] waitHandles, TimeSpan timeout); 
public const Int32 WaitTimeout = 258; // Возвращается WaitAny
// в случае тайм-аута
// Реализация Dispose вызывает функцию Win32
// CloseHandle – НЕ ВЫЗЫВАЙТЕ ЕЕ!
public void Dispose(); 
}


845
Конструкции.режима.ядра
Здесь следует сделать несколько замечаний:
‰
Метод 
WaitOne
класса 
WaitHandle
блокирует текущий поток до активизации 
объектом ядра. Он вызывает Win32-функцию 
WaitForSingleObjectEx
. Значение 
true
возвращается, если объект был активизирован. Если же время ожидания 
истекло, возвращается значение 
false
.
‰
Статический метод 
WaitAll
класса 
WaitHandle
заставляет вызывающий поток 
ждать активизации всех объектов ядра, указанных в массиве 
WaitHandle[]

Если все объекты были активизированы, возвращается значение 
true
, в случае 
же истечения времени ожидания возвращается значение 
false
. Данный метод 
вызывает Win32-функцию 
WaitForMultipleObjectsEx
, передавая параметру 
bWaitAll
значение 
TRUE
.
‰
Статический метод 
WaitAny
класса 
WaitHandle
заставляет вызывающий 
поток ждать активизации любого из объектов ядра, указанных в массиве 
WaitHandle[]
. Возвращенное значение типа 
Int32
является индексом ак-
тивизированного элемента массива. Если в процессе ожидания сигнала не 
поступило, возвращается значение 
WaitHandle.WaitTimeout
. Данный метод 
вызывает Win32-функцию 
WaitForMultipleObjectsEx
, передавая параметру 
bWaitAll
значение 
FALSE
.
‰
Метод 
Dispose
закрывает дескриптор объекта ядра. Во внутренней реализации 
эти методы вызывают функцию Win32 
CloseHandle
. Вызывать 
Dispose
в коде 
можно только в том случае, если вы абсолютно уверены, что объект ядра не 
используется другими потоками. Это обстоятельство сильно затрудняет напи-
сание и тестирование кода, поэтому я настоятельно не рекомендую вызывать 
Dispose
; просто позвольте уборщику мусора выполнить свою работу. Он сможет 
определить, когда объект не используется, и уничтожит его.

Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   624   625   626   627   628   629   630   631   ...   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