trylockmutex always fails..
BlitzMax Forums/BlitzMax Programming/trylockmutex always fails..
| ||
| Hello! I just ran into the problem that "trylockmutex" always returns false although - there is no other thread yet which could have locked the mutex and - all "lockmutex" (and other "trylockmutex") calls have been commented out (I just double checked that) Thus, NO thread has been able (yet) to lock the Mutex - but "trylockmutex" still fails (i.e. returns false) [added] I just created a new Mutex and tried to "trylockmutex" it - and (guess what?) failed! I.e., local Mutex:TMutex = createMutex()
if (tryLockMutex(Mutex)) then
writestdout("Yeah - it worked!")
end ifwill never print the message... [/added] [added] and...YES...I DID build a threaded executable (I have other Mutexes which work fine using "lockMutex"/"unlockMutex" - but here, I need "tryLockMutex"!) [/added] Does anybody have any idea? I am using BlitzMAX 1.38 with MaxGUI 1.39 on a Mac mini Intel running Mac OS X 10.4.11 Thanks in advance for any hints! |
| ||
Here is a complete sample program which illustrates the problemsuperstrict
local Mutex:TMutex = createMutex()
local Result:int = tryLockMutex(Mutex)
if (Result) then
writestdout("Yeah - it worked! (Result = " + Result + ")")
else
writestdout("Damn - it failed! (Result = " + Result + ")")
end if |
| ||
| Well, I guess I got it! Using the following code to "play around" with "trylockmutex" et al. superstrict
global Mutex:TMutex = createMutex()
global ThreadLocker:TSemaphore = createSemaphore(0)
function ThreadFunction:Object (Data:Object)
debuglog("Subthread: started")
lockMutex(Mutex)
debuglog("Subthread: locked Mutex")
debuglog("Subthread: now waiting forever")
waitSemaphore(ThreadLocker)
debuglog("Subthread: stopping")
end function
local Result:int
'Result = tryLockMutex(Mutex)
'debuglog("MainThread: tryLockMutex yields " + Result)
debuglog("MainThread: spawning Subthread")
local Subthread:TThread = createThread(ThreadFunction,null)
delay(1000)
debuglog("MainThread: about to tryLockMutex again")
Result = tryLockMutex(Mutex)
debuglog("MainThread: tryLockMutex yields " + Result)I found out that (under Mac OS X, at least): - trylockmutex basically works, but - trylockmutex yields 0 on success(!) and - trylockmutex yields something <> 0 on failure (i.e. when it could not lock the mutex) I still have to check what happens under Win32 (and Linux), but under MacOS X this knowledge allows for a simple "workaround"! |