Class: ConditionVariable

Inherits:
Object show all
Defined in:
thread_sync.c,
thread_sync.c

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

Constructor Details

#initializeObject

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

#broadcastObject

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_dumpObject

: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);
}

#signalObject

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;
}