Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Critical Section
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=1495
Страница 1 от 2

Автор:  Nikola Kirov [ Сря Дек 28, 2005 11:48 pm ]
Заглавие:  Critical Section

как се ползва CCriticalSection в Visual C++ ми е ясно. Но не мога да се сетя на практика как деиства това.
Някой задълбочавал ли се е?

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

Автор:  vlado [ Сря Дек 28, 2005 11:57 pm ]
Заглавие: 

CCriticalSection се ползва когато искаш дадени данни да бъдат достъпни само от една нишка в даден момент. Щото иначе може да стане, че нишка_1 ги чете точно в момента в който нишка_2 пише по тях и ги променя. И може да стане боза.
Дай генерален пример какво прави многонишковата програма с данните от USB-то и ще ти помогна с каквото знам.
Успех!

Автор:  Nikola Kirov [ Чет Дек 29, 2005 12:02 am ]
Заглавие: 

Как се работи с това го има описано. Имам примери. Правил съм и 2-3 неща вече. Интересува ме фактически как работи това. Какъв е принципа на работа.

Автор:  Bezmozachen [ Чет Дек 29, 2005 10:33 am ]
Заглавие: 

Ами с мутекси, семафори и т.н.т. Обекти на операционната система. Имам едно туториалче, само че за делфи, но те нещата се отнасят за всичко. Има добри примери как се организират разни там двупосочни буфери и т.н.т., как да се избягват дед-локове и други техники.

Прикачени файлове:
threads.zip [270.87 KiB]
213 пъти

Автор:  Nikola Kirov [ Чет Дек 29, 2005 11:28 am ]
Заглавие: 

И в това е обяснено как се ползват. Макар че само го прехвърлих набързо. Не е особенно подходящо четиво за C програмист.
Интересува ме не как се ползват а принцип на работа.

Автор:  t_i_t_o [ Чет Дек 29, 2005 11:37 am ]
Заглавие: 

В общия случай "влизането" в критична секция спира таск шедулера на операционната система, а с излизането тои се пуска отново, т.е. така ти се гарантира че докато си в критична секция управлението няма да се предаде на друг тред, което е и идеята на critical section. Дано съм помогнал.

Автор:  Bezmozachen [ Чет Дек 29, 2005 11:55 am ]
Заглавие: 

Небих казъл че диспечера се спира. Просто нишката която се иска достъп до критична секция се блокира докато критичната секция не се освободи от заелата я нишка. Като цяло Никола в примерите се ползва доста ВИН АПИ-то, така мисля ще е разбираемо и за Ц програмист.

Автор:  Nikola Kirov [ Чет Дек 29, 2005 1:08 pm ]
Заглавие: 

На мен ми е странно защо е реализирана като обект.

Автор:  Bezmozachen [ Чет Дек 29, 2005 1:25 pm ]
Заглавие: 

Като обект в Ц++ или като обект на операционната система. Първото е ясно, второто ами нали самата операционна система(диспечера на задачи) се грижи за превключването и синхронизирането на нишките, и трябва да знае кога една нишка влиза в дадена критична секция и ако след този момент се превключи на друга нишка и тя реши да влезе в същата критична секция, то диспечера ще я блокира, ще предаде управлението на предходната, тя ще напусне критичната секция и тогава диспичера ще активира втората нишка и ще и позволи да влезе в критичната секция.
Немога да разбера кое точно не ти е ясно, това помага ли като някакво обяснение?

Автор:  Bezmozachen [ Чет Дек 29, 2005 1:28 pm ]
Заглавие: 

По-принцип има начини да направиш такава синхронизация и без обекти на операционна система, но това е трудно и трябва да знаеш какво става на ниско ниво (разбирай ниво инструкция), т.е. да се получат атомични операции, но защо да си чупиш главата, като всичко ти е дадено на готово.

Автор:  Nikola Kirov [ Чет Дек 29, 2005 2:05 pm ]
Заглавие: 

Ами по това обяснение не става ясно какво точно прави операционната система с този обект.
Как става на практика.

Автор:  Bezmozachen [ Чет Дек 29, 2005 2:30 pm ]
Заглавие: 

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

Автор:  Bezmozachen [ Чет Дек 29, 2005 2:41 pm ]
Заглавие: 

Това може и да ти ползно, за по-добро разбиране, не съм го преглеждал подробно.
http://msdn.microsoft.com/msdnmag/issues/03/12/CriticalSections/default.aspx

Автор:  Bezmozachen [ Чет Дек 29, 2005 2:47 pm ]
Заглавие: 

Всъщност нещата можби са по-прости в виндовса:
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;

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

Автор:  stefan_b [ Вто Яну 03, 2006 11:27 pm ]
Заглавие: 

Nikola Kirov написа:
На мен ми е странно защо е реализирана като обект.


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


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

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/