Class: ConditionVariable
Overview
ConditionVariable objects augment class Mutex. Using condition variables, it is possible to suspend while in the middle of a critical section until a resource becomes available.
Example:
mutex = Mutex.new
resource = ConditionVariable.new
a = Thread.new {
mutex.synchronize
# Thread 'a' now needs the resource
resource.wait(mutex)
# 'a' can now have the resource
}
b = Thread.new {
mutex.synchronize
# Thread 'b' has finished using the resource
resource.signal
}
Instance Method Summary collapse
-
#broadcast ⇒ Object
Wakes up all threads waiting for this lock.
-
#initialize ⇒ Object
constructor
Creates a new condition variable instance.
-
#marshal_dump ⇒ Object
:nodoc:.
-
#signal ⇒ Object
Wakes up the first thread in line waiting for this lock.
-
#wait(mutex, timeout = nil) ⇒ Object
Releases the lock held in
mutex
and waits; reacquires the lock on wakeup.
Constructor Details
#initialize ⇒ Object
Creates a new condition variable instance.
1443 1444 1445 1446 1447 1448 1449 |
# File 'thread_sync.c', line 1443
static VALUE
rb_condvar_initialize(VALUE self)
{
struct rb_condvar *cv = condvar_ptr(self);
list_head_init(&cv->waitq);
return self;
}
|
Instance Method Details
#broadcast ⇒ Object
Wakes up all threads waiting for this lock.
1516 1517 1518 1519 1520 1521 1522 |
# File 'thread_sync.c', line 1516
static VALUE
rb_condvar_broadcast(VALUE self)
{
struct rb_condvar *cv = condvar_ptr(self);
wakeup_all(&cv->waitq);
return self;
}
|
#marshal_dump ⇒ Object
:nodoc:
1526 1527 1528 1529 1530 1531 |
# File 'thread_sync.c', line 1526
static VALUE
undumpable(VALUE obj)
{
rb_raise(rb_eTypeError, "can't dump %"PRIsVALUE, rb_obj_class(obj));
UNREACHABLE_RETURN(Qnil);
}
|
#signal ⇒ Object
Wakes up the first thread in line waiting for this lock.
1502 1503 1504 1505 1506 1507 1508 |
# File 'thread_sync.c', line 1502
static VALUE
rb_condvar_signal(VALUE self)
{
struct rb_condvar *cv = condvar_ptr(self);
wakeup_one(&cv->waitq);
return self;
}
|
#wait(mutex, timeout = nil) ⇒ Object
Releases the lock held in mutex
and waits; reacquires the lock on wakeup.
If timeout
is given, this method returns after timeout
seconds passed, even if no other thread doesn’t signal.
1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 |
# File 'thread_sync.c', line 1475
static VALUE
rb_condvar_wait(int argc, VALUE *argv, VALUE self)
{
rb_execution_context_t *ec = GET_EC();
struct rb_condvar *cv = condvar_ptr(self);
struct sleep_call args;
rb_scan_args(argc, argv, "11", &args.mutex, &args.timeout);
COROUTINE_STACK_LOCAL(struct sync_waiter, w);
w->self = args.mutex;
w->th = ec->thread_ptr;
w->fiber = ec->fiber_ptr;
list_add_tail(&cv->waitq, &w->node);
rb_ensure(do_sleep, (VALUE)&args, delete_from_waitq, (VALUE)w);
return self;
}
|