Class: ThreadGroup
Overview
ThreadGroup
provides a means of keeping track of a number of
threads as a group. A <code>Thread</code> can belong to only one
<code>ThreadGroup</code> 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 =
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 belonged.
-
#enclose ⇒ Object
Prevents threads from being added to or removed from the receiving
ThreadGroup
. -
#enclosed? ⇒ Boolean
Returns
true
if thgrp 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 belonged.
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}"
produces:
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>
3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 |
# File 'thread.c', line 3988
static VALUE
thgroup_add(VALUE group, VALUE thread)
{
rb_thread_t *th;
struct thgroup *data;
rb_secure(4);
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
produces:
ThreadError: can't move from the enclosed thread group
3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 |
# File 'thread.c', line 3930
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 thgrp is enclosed. See also ThreadGroup#enclose.
3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 |
# File 'thread.c', line 3950
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>]
3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 |
# File 'thread.c', line 3899
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;
}
|