[ Nedeljko @ 25.04.2008. 11:50 ] @
Zanimalo me je koliko su operacije zaključavanja/otključavanja mutex-a brze i napravio jedno testiranje. Napravio sam for petlju sa samo dve naredbe: mutex.lock(); mutex.unlock();. Izmerio sam vreme potrebno za izvršavanje petlje, a potom izvršio istu petlju, ali sa praznim telom da bih znao koliko je vremena potrošila sama petlja. Na kraju sam dobio vrlo čudne rezultate. Koristio sam Qt-ovu klasu QMutex i wxWidgets-ovu klasu wxMutex pod operativnim sistemima Windows XP Home i Mandriva One 2008. Navodim izmerena vremena za dve uzastopne naredbe mutex.lock(); mutex.unlock(); u nanosekundama:



E, sad, mene zanima zašto se wxWidgets vuče pod Windows-ima ko prebijena mačka. Jesam li nešto pogrešio prilikom merenja? Sve je bilo Release itd.

[Ovu poruku je menjao Nedeljko dana 25.04.2008. u 17:22 GMT+1]
[ Ivan Dimkovic @ 25.04.2008. 22:32 ] @
Mutexi (mislim bas na Win32 Mutex objekte) su u Windowsu relativno spori zato sto su system-wide objekti (a ne process-wide) i njihov menadzment zbog toga zahteva context-switcheve iz userlanda u kernel-mod - ako ti se threadovi izvrsavaju u istom procesu - znaci ne moras da sinhronizujes threadove iz razlicitih procesa, koristi kriticne sekcije koje su mnogo mnogo brze.

CreateCriticalSection(), EnterCriticalSection(), LeaveCriticalSection() su tvoji drugari - ako kod koristi mutexe, samo ih zameni sa kriticnim sekcijama :)

Pretpostavljam da je to u pitanju (posto onako veliki broj nanosekundi mirise na ring3->ring0 context-switch), ako nije - onda nesto pogresno radis, posto su kriticne sekcije vrlo "lake".

@edit - evo pogledao sam kod:

Citat:

wxMutexInternal::wxMutexInternal(wxMutexType WXUNUSED(mutexType))
{
// create a nameless (hence intra process and always private) mutex
m_mutex = ::CreateMutex
(
NULL, // default secutiry attributes
false, // not initially locked
NULL // no name
);

if ( !m_mutex )
{
wxLogLastError(_T("CreateMutex()"));
}
}


Dakle, koriste se Win32 Mutexi, sto je jako los izbor ako je u pitanju sinhronizacija threadova unutar procesa.

Cak su dali i komentar: (hence intra process and always private). Dakle, upotreba pogresnog nacina sinhronizacije - treba koristiti kriticne sekcije. Lepo pise u uputstvima za multithreaded programiranje na MSDN-u.

Zamena Win32 Mutexa sa Win32 kriticnim sekcijama je vrlo laka, posto je funkcionalnost enkapsulirana unutar klase wxMutexInternal, pa za ostatak koda uopste nece biti razlike, a osetices vrlo veliku razliku u brzini.

[Ovu poruku je menjao Ivan Dimkovic dana 25.04.2008. u 23:51 GMT+1]
[ X Files @ 29.04.2008. 07:06 ] @
Da. To za kriticne sekcije je vec u nekoliko navrata na ES-u bilo pominjano:
http://www.elitesecurity.org/t293094-0#1745579
(ovde je dat jedan od primera upakovan u RAII patern, a ima i mnogo slicnih po forumu)

Licno, mutexe koristim uglavnom za ispitivanje OnlyOneInstance programa, a korisni su i instalacionim procedurama jer mutex string koji im se kaze, koriste radi slicnih stvari.