boost::shared_mutex problem
-
Hallo zusammen, ich habe aktuell ein Problem mit einen boost::shared_mutex.
Daher erstmal 1 Frage vorweg: Funktioniert der auch in verwendung mit posix threads? Das ganze hatte sich historisch so entwickelt. Ansonsten könnte ich die Klassen entsprechend auf boost::thread umstricken.Aber nun zum problem, der Thread der auf den shared_mutex exklusiv zugreifen soll blockiert obwohl scheinbar nirgendwo anders zugriff erfolgt. Den exklusiven zugriff möchte ich so erwirken:
void CPlayerManager::setLoginLogout(bool val) { if ( val ) { //anmelden des exklusiven zugriffs reloadmutex.lock_upgrade(); //bekommen des exklusiven zugriffs reloadmutex.unlock_upgrade_and_lock(); //<--hier blockts } else { //exklusiver zugriff freigeben reloadmutex.unlock(); } }In zwei anderen Threads brauche ich auf den Mutex nur lese zugriff das geschieht prinzipiell so
reloadmutex.lock_shared(); CPlayer * newPlayer = new CPlayer(Connection); //release shared lock reloadmutex.unlock_shared();GDB meint das keiner der beiden Threads sich gerade in einen zustand befindet welche das lock_shared() oder ähnliches abfragen aber trotz allem Blockiert der Hauptthread. Irgendwie mache ich noch was falsch. Ggf hab ich das prinzip des shared_mutex auch nur falsch verstanden?
Hier noch der GDB Auszug über den zustand vom reloadmutex
$2 = {state = {shared_count = 5, exclusive = false, upgrade = true, exclusive_waiting_blocked = false}, state_change = {<boost::noncopyable_::noncopyable> = {<No data fields>}, m = {__data = {__lock = 0, __count = 0, __owner = 0, __kind = 0, __nusers = 1, {__spins = 0, __list = {__next = 0x0}}}, __size = '\0' <repeats 16 times>, "\001\000\000\000\000\000\000", __align = 0}}, shared_cond = {cond = {__data = { __lock = 0, __futex = 0, __total_seq = 0, __wakeup_seq = 0, __woken_seq = 0, __mutex = 0x0, __nwaiters = 0, __broadcast_seq = 0}, __size = '\0' <repeats 47 times>, __align = 0}}, exclusive_cond = {cond = {__data = { __lock = 0, __futex = 0, __total_seq = 0, __wakeup_seq = 0, __woken_seq = 0, __mutex = 0x0, __nwaiters = 0, __broadcast_seq = 0}, __size = '\0' <repeats 47 times>, __align = 0}}, upgrade_cond = {cond = {__data = { __lock = 0, __futex = 1, __total_seq = 1, __wakeup_seq = 0, __woken_seq = 0, __mutex = 0x83df988, __nwaiters = 2, __broadcast_seq = 0}, __size = "\000\000\000\000\001\000\000\000\001", '\0' <repeats 23 times>, "\210ù=\b\002\000\000\000\000\000\000\000\000\000\000", __align = 4294967296}}}hoffe mir kann jemand helfen.
-
Ok, das problem konnte dann doch auf einfache weise behoben werden (hoffe ich) das problem war ein try catch block in dem ein shared_lock eingebettet war, dieser hat den lock nicht freigegeben.