Class: ThreadGroup
Overview
ThreadGroup provides a means of keeping track of a number of threads as a
group.
A given Thread object can only belong to one ThreadGroup at a time; adding
a thread to a new group will remove it from any previous group.
Newly created threads belong to the same group as the thread from which they
were created.
Constant Summary collapse
- Default =
The default ThreadGroup created when Ruby starts; all Threads belong to it
by default.
th->thgroup
Instance Method Summary collapse
-
#add(thread) ⇒ Object
Adds the given
thread
to this group, removing it from any other group to which it may have previously been a member. -
#enclose ⇒ Object
Prevents threads from being added to or removed from the receiving ThreadGroup.
-
#enclosed? ⇒ Boolean
Returns
true
if thethgrp
is enclosed. -
#list ⇒ Array
Returns an array of all existing Thread objects that belong to this group.
Instance Method Details
#add(thread) ⇒ Object
Adds the given thread
to this group, removing it from any other group to which it may have previously been a member.
puts "Initial group is #{ThreadGroup::Default.list}"
tg = ThreadGroup.new
t1 = Thread.new { sleep }
t2 = Thread.new { sleep }
puts "t1 is #{t1}"
puts "t2 is #{t2}"
tg.add(t1)
puts "Initial group now #{ThreadGroup::Default.list}"
puts "tg group now #{tg.list}"
This will produce:
Initial group is #<Thread:0x401bdf4c>
t1 is #<Thread:0x401b3c90>
t2 is #<Thread:0x401b3c18>
Initial group now #<Thread:0x401b3c18>#<Thread:0x401bdf4c>
tg group now #<Thread:0x401b3c90>
4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 |
# File 'thread.c', line 4052
static VALUE
thgroup_add(VALUE group, VALUE thread)
{
rb_thread_t *th;
struct thgroup *data;
GetThreadPtr(thread, th);
if (OBJ_FROZEN(group)) {
rb_raise(rb_eThreadError, "can't move to the frozen thread group");
}
TypedData_Get_Struct(group, struct thgroup, &thgroup_data_type, data);
if (data->enclosed) {
rb_raise(rb_eThreadError, "can't move to the enclosed thread group");
}
if (!th->thgroup) {
return Qnil;
}
if (OBJ_FROZEN(th->thgroup)) {
rb_raise(rb_eThreadError, "can't move from the frozen thread group");
}
TypedData_Get_Struct(th->thgroup, struct thgroup, &thgroup_data_type, data);
if (data->enclosed) {
rb_raise(rb_eThreadError,
"can't move from the enclosed thread group");
}
th->thgroup = group;
return group;
}
|
#enclose ⇒ Object
Prevents threads from being added to or removed from the receiving ThreadGroup.
New threads can still be started in an enclosed ThreadGroup.
ThreadGroup::Default.enclose #=> #<ThreadGroup:0x4029d914>
thr = Thread::new { Thread.stop } #=> #<Thread:0x402a7210 sleep>
tg = ThreadGroup::new #=> #<ThreadGroup:0x402752d4>
tg.add thr
#=> ThreadError: can't move from the enclosed thread group
3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 |
# File 'thread.c', line 3995
static VALUE
thgroup_enclose(VALUE group)
{
struct thgroup *data;
TypedData_Get_Struct(group, struct thgroup, &thgroup_data_type, data);
data->enclosed = 1;
return group;
}
|
#enclosed? ⇒ Boolean
Returns true
if the thgrp
is enclosed. See also ThreadGroup#enclose.
4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 |
# File 'thread.c', line 4014
static VALUE
thgroup_enclosed_p(VALUE group)
{
struct thgroup *data;
TypedData_Get_Struct(group, struct thgroup, &thgroup_data_type, data);
if (data->enclosed)
return Qtrue;
return Qfalse;
}
|
#list ⇒ Array
Returns an array of all existing Thread objects that belong to this group.
ThreadGroup::Default.list #=> [#<Thread:0x401bdf4c run>]
3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 |
# File 'thread.c', line 3963
static VALUE
thgroup_list(VALUE group)
{
VALUE ary = rb_ary_new();
rb_vm_t *vm = GET_THREAD()->vm;
rb_thread_t *th = 0;
list_for_each(&vm->living_threads, th, vmlt_node) {
if (th->thgroup == group) {
rb_ary_push(ary, th->self);
}
}
return ary;
}
|