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]
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos:
http://www.digicortex.net/node/17 Gallery:
http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! -
https://github.com/psyq321/PowerMonkey