| Class | Mutex |
| In: |
ext/fastthread/fastthread.c
ext/fastthread/fastthread.c |
| Parent: | Object |
Mutex implements a simple semaphore that can be used to coordinate access to shared data from multiple concurrent threads.
Example:
require 'thread'
semaphore = Mutex.new
a = Thread.new {
semaphore.synchronize {
# access shared resource
}
}
b = Thread.new {
semaphore.synchronize {
# access shared resource
}
}
If the mutex is locked, unlocks the mutex, wakes one waiting thread, and yields in a critical section.
If the mutex is locked, unlocks the mutex, wakes one waiting thread, and yields in a critical section.
Returns true if this lock is currently held by some thread.
/*
* Document-method: locked?
* call-seq: locked?
*
* Returns +true+ if this lock is currently held by some thread.
*
*/
static VALUE
rb_mutex_locked_p(VALUE self)
{
Mutex *mutex;
Data_Get_Struct(self, Mutex, mutex);
return MUTEX_LOCKED_P(mutex) ? Qtrue : Qfalse;
}
Returns true if this lock is currently held by some thread.
/*
* Document-method: locked?
* call-seq: locked?
*
* Returns +true+ if this lock is currently held by some thread.
*
*/
static VALUE
rb_mutex_locked_p(VALUE self)
{
Mutex *mutex;
Data_Get_Struct(self, Mutex, mutex);
return MUTEX_LOCKED_P(mutex) ? Qtrue : Qfalse;
}
for marshalling mutexes and condvars
/* for marshalling mutexes and condvars */
static VALUE
dummy_load(VALUE self, VALUE string)
{
return Qnil;
}
for marshalling mutexes and condvars
/* for marshalling mutexes and condvars */
static VALUE
dummy_load(VALUE self, VALUE string)
{
return Qnil;
}
Obtains a lock, runs the block, and releases the lock when the block completes. See the example under Mutex.
/*
* Document-method: synchronize
* call-seq: synchronize { ... }
*
* Obtains a lock, runs the block, and releases the lock when the block
* completes. See the example under Mutex.
*
*/
static VALUE
rb_mutex_synchronize(VALUE self)
{
rb_mutex_lock(self);
return rb_ensure(rb_yield, Qundef, rb_mutex_unlock, self);
}
Obtains a lock, runs the block, and releases the lock when the block completes. See the example under Mutex.
/*
* Document-method: synchronize
* call-seq: synchronize { ... }
*
* Obtains a lock, runs the block, and releases the lock when the block
* completes. See the example under Mutex.
*
*/
static VALUE
rb_mutex_synchronize(VALUE self)
{
rb_mutex_lock(self);
return rb_ensure(rb_yield, Qundef, rb_mutex_unlock, self);
}
Attempts to obtain the lock and returns immediately. Returns true if the lock was granted.
/*
* Document-method: try_lock
* call-seq: try_lock
*
* Attempts to obtain the lock and returns immediately. Returns +true+ if the
* lock was granted.
*
*/
static VALUE
rb_mutex_try_lock(VALUE self)
{
Mutex *mutex;
Data_Get_Struct(self, Mutex, mutex);
if (MUTEX_LOCKED_P(mutex))
return Qfalse;
mutex->owner = rb_thread_current();
return Qtrue;
}
Attempts to obtain the lock and returns immediately. Returns true if the lock was granted.
/*
* Document-method: try_lock
* call-seq: try_lock
*
* Attempts to obtain the lock and returns immediately. Returns +true+ if the
* lock was granted.
*
*/
static VALUE
rb_mutex_try_lock(VALUE self)
{
Mutex *mutex;
Data_Get_Struct(self, Mutex, mutex);
if (MUTEX_LOCKED_P(mutex))
return Qfalse;
mutex->owner = rb_thread_current();
return Qtrue;
}