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>
4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 |
# File 'thread.c', line 4108
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
4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 |
# File 'thread.c', line 4051
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.
4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 |
# File 'thread.c', line 4070
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>]
4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 |
# File 'thread.c', line 4022
static VALUE
thgroup_list(VALUE group)
{
VALUE ary = rb_ary_new();
struct thgroup_list_params param;
param.ary = ary;
param.group = group;
st_foreach(GET_THREAD()->vm->living_threads, thgroup_list_i, (st_data_t) & param);
return ary;
}
|