Class: ConditionVariable

Inherits:
Object
  • Object
show all
Defined in:
thread.c,
thread.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:

require 'thread'

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.



97
98
99
100
101
102
# File 'thread.c', line 97

static VALUE
rb_condvar_initialize(VALUE self)
{
    RSTRUCT_SET(self, CONDVAR_WAITERS, ary_buf_new());
    return self;
}

Instance Method Details

#broadcastObject

Wakes up all threads waiting for this lock.



170
171
172
173
174
175
# File 'thread.c', line 170

static VALUE
rb_condvar_broadcast(VALUE self)
{
    wakeup_all_threads(GET_CONDVAR_WAITERS(self));
    return self;
}

#marshal_dumpObject



547
548
549
550
551
552
# File 'thread.c', line 547

static VALUE
undumpable(VALUE obj)
{
    rb_raise(rb_eTypeError, "can't dump %"PRIsVALUE, rb_obj_class(obj));
    UNREACHABLE;
}

#signalObject

Wakes up the first thread in line waiting for this lock.



157
158
159
160
161
162
# File 'thread.c', line 157

static VALUE
rb_condvar_signal(VALUE self)
{
    wakeup_first_thread(GET_CONDVAR_WAITERS(self));
    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.



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'thread.c', line 134

static VALUE
rb_condvar_wait(int argc, VALUE *argv, VALUE self)
{
    VALUE waiters = GET_CONDVAR_WAITERS(self);
    VALUE mutex, timeout;
    struct sleep_call args;

    rb_scan_args(argc, argv, "11", &mutex, &timeout);

    args.mutex   = mutex;
    args.timeout = timeout;
    rb_ary_push(waiters, rb_thread_current());
    rb_ensure(do_sleep, (VALUE)&args, delete_current_thread, waiters);

    return self;
}