Отговори на тема  [ 19 мнения ]  Отиди на страница 1, 2  Следваща
Critical Section 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Critical Section
как се ползва CCriticalSection в Visual C++ ми е ясно. Но не мога да се сетя на практика как деиства това.
Някой задълбочавал ли се е?

Просто пиша една многонишкова програмка която обработва поток от дании от USB-to и ми се иска да я оптимизирам добре а като не знам как точно е реализирано това нещо не мога да се ориентирам какво мога да оптимизирам.


Сря Дек 28, 2005 11:48 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Чет Ное 10, 2005 9:26 pm
Мнения: 393
Местоположение: Buffalo, NY, USA
Мнение 
CCriticalSection се ползва когато искаш дадени данни да бъдат достъпни само от една нишка в даден момент. Щото иначе може да стане, че нишка_1 ги чете точно в момента в който нишка_2 пише по тях и ги променя. И може да стане боза.
Дай генерален пример какво прави многонишковата програма с данните от USB-то и ще ти помогна с каквото знам.
Успех!

_________________
http://blog.georgievi.com


Сря Дек 28, 2005 11:57 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Как се работи с това го има описано. Имам примери. Правил съм и 2-3 неща вече. Интересува ме фактически как работи това. Какъв е принципа на работа.


Чет Дек 29, 2005 12:02 am
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Апр 27, 2005 2:47 pm
Мнения: 349
Местоположение: Varna
Мнение 
Ами с мутекси, семафори и т.н.т. Обекти на операционната система. Имам едно туториалче, само че за делфи, но те нещата се отнасят за всичко. Има добри примери как се организират разни там двупосочни буфери и т.н.т., как да се избягват дед-локове и други техники.


Прикачени файлове:
threads.zip [270.87 KiB]
211 пъти
Чет Дек 29, 2005 10:33 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
И в това е обяснено как се ползват. Макар че само го прехвърлих набързо. Не е особенно подходящо четиво за C програмист.
Интересува ме не как се ползват а принцип на работа.


Чет Дек 29, 2005 11:28 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Вто Окт 25, 2005 10:54 am
Мнения: 896
Мнение 
В общия случай "влизането" в критична секция спира таск шедулера на операционната система, а с излизането тои се пуска отново, т.е. така ти се гарантира че докато си в критична секция управлението няма да се предаде на друг тред, което е и идеята на critical section. Дано съм помогнал.


Чет Дек 29, 2005 11:37 am
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Апр 27, 2005 2:47 pm
Мнения: 349
Местоположение: Varna
Мнение 
Небих казъл че диспечера се спира. Просто нишката която се иска достъп до критична секция се блокира докато критичната секция не се освободи от заелата я нишка. Като цяло Никола в примерите се ползва доста ВИН АПИ-то, така мисля ще е разбираемо и за Ц програмист.


Чет Дек 29, 2005 11:55 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
На мен ми е странно защо е реализирана като обект.


Чет Дек 29, 2005 1:08 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Апр 27, 2005 2:47 pm
Мнения: 349
Местоположение: Varna
Мнение 
Като обект в Ц++ или като обект на операционната система. Първото е ясно, второто ами нали самата операционна система(диспечера на задачи) се грижи за превключването и синхронизирането на нишките, и трябва да знае кога една нишка влиза в дадена критична секция и ако след този момент се превключи на друга нишка и тя реши да влезе в същата критична секция, то диспечера ще я блокира, ще предаде управлението на предходната, тя ще напусне критичната секция и тогава диспичера ще активира втората нишка и ще и позволи да влезе в критичната секция.
Немога да разбера кое точно не ти е ясно, това помага ли като някакво обяснение?


Чет Дек 29, 2005 1:25 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Апр 27, 2005 2:47 pm
Мнения: 349
Местоположение: Varna
Мнение 
По-принцип има начини да направиш такава синхронизация и без обекти на операционна система, но това е трудно и трябва да знаеш какво става на ниско ниво (разбирай ниво инструкция), т.е. да се получат атомични операции, но защо да си чупиш главата, като всичко ти е дадено на готово.


Чет Дек 29, 2005 1:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Ами по това обяснение не става ясно какво точно прави операционната система с този обект.
Как става на практика.


Чет Дек 29, 2005 2:05 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Апр 27, 2005 2:47 pm
Мнения: 349
Местоположение: Varna
Мнение 
Практичеки и аз незнам какво точно прави, при различни ОС ще е различно. Аз си го представям така:
При влизане в критичната секция правиш обращение към ОС, като параметър подаваш обекта. Да кажем обекта съдържа флаг оказващ да ли някоя нишка е вклязла или не в критичната секция и ако да вероятно съдържа и индификатор (хендъл) на нишката, също така можеби се съдържа и списък с нишките желаещи да влязат в критичната секция. Та ако флага е свален, ОС вдига флага и отбелязва коя нишка е влязла и продължава изпълнението на нишката. Ако в този момент се превключи на друга нишка и тя направи същото, ОС блокира тази нишка отбелязва в обекта че тази нишка иска да влезе и продължава с изпълнението на нишката която вече е влязла. След като тя излезе, което отново става със системно повикване, ОС проверява има ли други кандидати (от списака на обекта) и ако да, се разрешава на следващата нишка да влезе по начина описан по-горе. Общо взето това е просто обяснение на процеса.


Чет Дек 29, 2005 2:30 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Апр 27, 2005 2:47 pm
Мнения: 349
Местоположение: Varna
Мнение 
Това може и да ти ползно, за по-добро разбиране, не съм го преглеждал подробно.
http://msdn.microsoft.com/msdnmag/issues/03/12/CriticalSections/default.aspx


Чет Дек 29, 2005 2:41 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Апр 27, 2005 2:47 pm
Мнения: 349
Местоположение: Varna
Мнение 
Всъщност нещата можби са по-прости в виндовса:
typedef struct _RTL_CRITICAL_SECTION {
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;

//
// The following three fields control entering and exiting the critical
// section for the resource
//

LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread; // from the thread's ClientId->UniqueThread
HANDLE LockSemaphore;
DWORD SpinCount;
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

Като гледам съдържа броя блокирани нишки, хендъл към нишката която е влязла, хендъл на семафора използван за практическата и реализация, другите не са ми много ясни.


Чет Дек 29, 2005 2:47 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Яну 03, 2006 11:21 pm
Мнения: 6
Мнение 
Nikola Kirov написа:
На мен ми е странно защо е реализирана като обект.


Организацията на WindowsNT, 2K, XP и т.н. е обектно-базирана, т.е. критичните секции, отворените файлове, и дори входно-изходните заявки се представят като обекти.


BTW, ако искаш да оптимизираш нещата наистина много, силно и докрай, опитай с non-blocking synchronization в Google въпреки че аз не бих хвърлял време за това - правил съм USB комуникация със синхронизация по най-простия начин (май беше с Mutex-и) и процесора се товареше не повече от няколко процента.


Вто Яну 03, 2006 11:27 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 19 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 6 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни