глава 7
многонишково
С цялото внимание се фокусира върху показалеца на мишката, че е лесно да се забрави, че над - само част от приложението. След появата на курсора на приложението не трябва да бъде коренно различна от по-горе, така че не е желателно да поставите код вход от мишката и курсора в средата на актуализиране на приложението. И дори ако сме съгласни с това, тъй като на този код ще изглежда така? Трябва постоянно да се проверява за нови данни от мишката. При засичане на данните, които актуализира курсора на мишката; в противен случай продължава нормалната си работа. Постоянен проучване на мишката бавно прилагане и сложността на неговата структура. По-добро решение - разделена на прилагането на две подзадачи с помощта многонишково.
Ако вече сте запознати с концепцията за многонишкова, няма да бъде необходимо този раздел. Въпреки това, за начинаещи, тя не засяга основните разпоредби, за да се научат преди да преминат към програмирането. При никакви обстоятелства не трябва да се тълкува като подробно ръководство за резби.
Потоци и процеси
Вие сте наясно с това или не, вече сте запознати с нишки и процеси. Всеки път, когато се създава нов процес, когато програмата започва. Процесът позволява на програмата на всички, че тя трябва да се работи, включително и една нишка (конци). Този стандарт поток (наречен също главния поток - основна нишка) се използва за изпълнение на програмния код. Основният поток на типичен процес започва с входна точка (за Windows-базирани програми е функцията WinMain ()) и продължава да се извършва в съответствие с всички линии, условни конструкции и извиквания на функции. Основният поток е завършена с приключване на процеса.
Въпреки това, нищо ограничава един процес поток. MFC или Win32 инструменти ви позволяват да създавате допълнителни теми, които обикновено се използват за извършване на фонови задачи. Тези допълнителни потоци (понякога наричани поток) работят независимо от главния поток (както и един от друг). Всяка нишка има своя стак, но системните ресурси (като например файлове и динамична памет) се разпределят между нишки.
Защо многонишкова?
Multithreading е от полза, ако имате няколко задачи, които могат (поне частично), за да работят едновременно. Код правилно написана многонишков заявление изглежда проста, тъй като всяка нишка изпълнява конкретна задача.
От друга страна, прилагането многонишковите по-трудно да се напише и отстраняване на грешки. Вие ще трябва да се синхронизира многонишков достъп до споделени ресурси, за да се избегне непредсказуеми резултати, както и координира изпълнението на целия код, за да се гарантира правилната последователност на събитията.
Един последен въпрос: на един процесор компютър, многонишковите приложения не работи по-бързо, отколкото с един резба. увеличава скоростта с която само за многопроцесорна компютър с няколко операционни системи (например, Windows NT).
синхронизация резба
Добавяне на нов поток в програмата е проста - той е много по-трудно да се организира изпълнението и завършването, толкова много функции са многонишков API, създаден специално за синхронизация нишка. В тази секция разглеждаме накратко такава синхронизация.
Потоци се координират със събития (събития), които предават информация за състоянието на един или повече потоци. Събитието може да се настрои (знак) или изхвърля (unsignaled). Бетонният значението на събитията може да варира, но обикновено те сигнализират блокиране на потока.
Блокиране на потока може да си представим като линия, непрекъснато разпитват определена логическа променлива. Цикълът продължава толкова дълго, колкото на променливата не взема стойността TRUE. От техническа гледна точка, това не е съвсем точна, защото тя блокира потока на събитията, не предизвиква активни анкети. Вместо това, той е спрян, а системата го премахва от списъка на активните теми. Само след блокиране на събитието ще отидат за инсталирано състояние, конецът се възстановява. Съответно блокиран нишка едва ли консумира процесорно време.
Блокиране поток е най-често се използва за защита на споделени ресурси от едновременен достъп от множество нишки. Mutex (мутекс, намаляване на взаимно изключващи се, че е "взаимно изключващи се") е обект, който може да бъде по всяко време, собственост на само една нишка, осигуряване на сигурен достъп до ресурси, свързани. Когато мутекс принадлежи към поток, всички други теми, които се опитват да го получи на свое разположение, за да реализира мутекс заключена.
Критични участъци (критична точка), като mutexes, се използват за предотвратяване на едновременен достъп до ресурс от множество нишки. Въпреки това, ако мутекс да синхронизирате Interprocess потоци, критичната точка е ограничена до един и същ процес поток. Ограничение на скоростта е компенсиран - критична точка е по-бързо от мутекс.
Семафори (семафор) също могат да се използват за ограничаване на достъпа до ресурси, но за разлика от мутекс или семафор на критичните участъци позволява едновременен достъп от множество нишки. Максималният брой теми, по едно и също време, да получат достъп до този ресурс е решен да създаде семафор. След това се предоставя достъп до всички потоци, докато броят им достигне предварително определен лимит. Всички други теми, които искат да имат достъп са блокирани, докато един или повече потоци не спрат да работят с ресурса.
Класове потоци MFC
За многонишковите програми в Windows, можете да избирате между класове на MFC и Win32 стрийминг функции. Microsoft препоръчва да използвате в потоците на MFC-приложни клас. За теми в MFC предоставя следните класове:
Клас CWinThread представлява отделен поток. Това присъства във всички приложения, защото класа CWinApp (базовия клас за DirectDrawApp) е получен от CWinThread. Това например е основното приложение поток CWinThread; за добавяне на нови работни процеси, създаване на CWinThread обекти.
CSyncObject клас е виртуална. не са разрешени за незабавно създаване на копия на този клас; тя съществува само за да се гарантира функционалността на извлечения клас. CSyncObject клас е базов клас за CEvent. CCriticalSection. CMutex и CSemaphore. Синхронизация обекти, представени от тези класове, обсъдени в предишния раздел.
Класове CSingleLock CMultiLock и използват за блокиране на потока като едно или повече събития. Клас CSingleLock блокира потока преди инсталирането на определен случай, и CMultiLock - да инсталирате един или всички събития от даден набор.
По-късно в тази глава, ние ще използваме класовете CWinThread. CEvent. CCriticalSSection и CMultiLock.