// blocks others acquire(obj): // unblocks others, throws ex if called without lock(obj) first release(obj):acquire(obj) should be called as early as possible. release(obj) should be called as late as possible.
acquire(obj) cannot be the 1st statement for lock(obj) to be reentrant. It is ok if 1+ threads pass the if as acquire(obj) will allow only 1st thread and block others.
Calling release(obj) without acquire(obj) will throw.
locker:
obj
count = 0
thread = null
//ctor
locker(obj):
obj = obj
lock():
// any other thread gets blocked (reentrant)
if thread != thread.current:
acquire(obj)
thread = thread.current
count++
unlock():
if thread != thread.current:
throw //as release called without lock
count--
if count == 0:
thread = null
// unblocks blocked threads
release(obj)
Used as:
lockobj1 = new locker(obj1) lockobj1.lock() //1st // critical section // ok to call lock() again lockobj1.lock() //2nd ... lockobj1.unlock() //2nd lockobj1.unlock() //1st[Hat tip to PK]
No comments:
Post a Comment