# Thread.bind(sym, val) { ... }

**URL:** <https://www.ruby-forum.com/t/thread-bind-sym-val/192379>\
**Category:** Development\
**Created:** [July 29, 2010, 11:43am UTC](https://www.ruby-forum.com/t/thread-bind-sym-val/192379 "2010-07-29T11:43:20Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 29, 2010, 11:43am UTC](https://www.ruby-forum.com/t/thread-bind-sym-val/192379/1 "2010-07-29T11:43:20Z")

</div>

e$B%9%l%C%IJQ?t$r0l;~E\*$K@\_Dj$9$k%a%=%C%I$r2C$($k$N$O$I$&$G$7$g$&$+!#e(B

e$B$?$H$($Pe(B Thread#bind(sym, val) { … } e$B$H$7$F!“e(B  
e$B%V%m%C%/$r8F$S=P$7$F$$$k$”$$$@!"%9%l%C%IJQ?te(B sym e$B$re(B  
val e$B$K@\_Dj$9$k!"$H$$$&$h$&$J$b$N$G$9!#e(B

p Thread.current[:a] # nil  
Thread.current.bind(:a, 100) {  
p Thread.current[:a] # 100  
}  
p Thread.current[:a] # nil e$B$KLa$ke(B

e$B%9%l%C%IJQ?t$O$3$N$h$&$J;H$$J}$,B?$$$N$G!"%a%=%C%I$,$"$C$F$b$$$$e(B  
e$B$h$&$K;W$$$^$9!#e(B

e$B$J$\*!"e(Bbind e$B0J30$NL\>A0$H$7$F$Oe(B let e$B$,;W$$Ib$+$S$^$9!#e(B

e$B$^$?!“e(BThread e$B$8$c$J$/$Fe(B Fiber  
e$B$8$c$J$$$+!”$H$$$&OC$O$"$k$+$b$7$l$^$;$s!#e(B

# % svn diff --diff-cmd diff -x ‘-u -p’ Index: thread.c

— thread.c (revision 28780)  
+++ thread.c (working copy)  
@@ -2071,6 +2071,59 @@ rb\_thread\_aset(VALUE self, VALUE id, VAL  
return rb\_thread\_local\_aset(self, rb\_to\_id(id), val);  
}

+struct rb\_thread\_bind\_arg {

- VALUE thread;
- ID id;
- VALUE old;  
+};
- 

+static VALUE  
+rb\_thread\_bind\_ensure(VALUE \_arg)  
+{

- struct rb\_thread\_bind\_arg \*arg = (struct rb\_thread\_bind\_arg \*)\_arg;
- rb\_thread\_local\_aset(arg-\>thread, arg-\>id, arg-\>old);
- return Qnil;  
+}
- 

+/\*

- 
  - call-seq:

- 
  - 

```
thr.bind(sym, obj) { ... }

```

- 
  - 

- 
  - Set the attribute temporally.

- 
  - 

- 
  - This method sets the attribute _sym_ of the thread _thr_ as _obj_

- 
  - between the block is called.

- 
  - It restore the attribute after the block exits

- 
  - even if an exception is raised in the block.

- 
  - 

- 
  - This method returns the value of the block.

- 
  - 

- 
  - 

```
Thread.current.bind(:a, 1) {

```

- 
  - 

```
  # Thread.current[:a] is 1.

```

- 
  - 

```
  Thread.current.bind(:a, 2) {

```

- 
  - 

```
    # Thread.current[:a] is 2.

```

- 
  - 

```
    Thread.current.bind(:a, 3) {

```

- 
  - 

```
      # Thread.current[:a] is 3.

```

- 
  - 

```
    }

```

- 
  - 

```
    # Thread.current[:a] is 2.

```

- 
  - 

```
  }

```

- 
  - 

```
  # Thread.current[:a] is 1.

```

- 
  - 

```
}

```

- 
  - 

- \*/
- 

+static VALUE  
+rb\_thread\_bind(VALUE thread, VALUE sym, VALUE val)  
+{

- ID id = rb\_to\_id(sym);
- struct rb\_thread\_bind\_arg arg;
- arg.thread = thread;
- arg.id = id;
- arg.old = rb\_thread\_local\_aref(thread, id);
- rb\_thread\_local\_aset(thread, id, val);
- return rb\_ensure(rb\_yield, Qnil, rb\_thread\_bind\_ensure,  
(VALUE)&arg);  
+}
- 

/\*

- call-seq:
- 

```
thr.key?(sym) -> true or false

```

@@ -4202,6 +4255,7 @@ Init\_Thread(void)  
rb\_define\_method(rb\_cThread, “wakeup”, rb\_thread\_wakeup, 0);  
rb\_define\_method(rb\_cThread, “[]”, rb\_thread\_aref, 1);  
rb\_define\_method(rb\_cThread, “[]=”, rb\_thread\_aset, 2);

- rb\_define\_method(rb\_cThread, “bind”, rb\_thread\_bind, 2);  
rb\_define\_method(rb\_cThread, “key?”, rb\_thread\_key\_p, 1);  
rb\_define\_method(rb\_cThread, “keys”, rb\_thread\_keys, 0);  
rb\_define\_method(rb\_cThread, “priority”, rb\_thread\_priority, 0);

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 29, 2010, 12:03pm UTC](https://www.ruby-forum.com/t/thread-bind-sym-val/192379/2 "2010-07-29T12:03:14Z")

</div>

> p Thread.current[:a] # nil e$B$KLa$ke(B
> 
> e$B%9%l%C%IJQ?t$O$3$N$h$&$J;H$$J}$,B?$$$N$G!"%a%=%C%I$,$"$C$F$b$$$$e(B  
> e$B$h$&$K;W$$$^$9!#e(B
> 
> e$B$J$\*!"e(Bbind e$B0J30$NL\>A0$H$7$F$Oe(B let e$B$,;W$$Ib$+$S$^$9!#e(B
> 
> e$B$^$?!“e(BThread e$B$8$c$J$/$Fe(B Fiber e$B$8$c$J$$$+!”$H$$$&OC$O$"$k$+$b$7$l$^$;$s!#e(B

Fibere$B$,$$$$$J$!!&!&!&!&e(B

e$B$=$l$O$=$l$H$7$F!"%a%=%C%I$G$d$k$h$j$b%9%l%C%I%m!\<%+%kJQ?t$r@k8@$9$ke(B  
e$B9=J8$D$/$C$?$[$&$,$&$l$7$$$h$&$J5$$,$A$g$C$H$@$1$7$^$9!#e(B  
e$B$?$+$,JQ?t#1$D$N$?$a$K!"%$%s%G%s%H$,0lCJ?\<$/$J$k$H$$$&$N$,$I$&$K$b!&!&!&e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 29, 2010, 12:16pm UTC](https://www.ruby-forum.com/t/thread-bind-sym-val/192379/3 "2010-07-29T12:16:07Z")

</div>

2010/7/29 KOSAKI Motohiro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > e$B%9%l%C%IJQ?t$r0l;~E\*$K@\_Dj$9$k%a%=%C%I$r2C$($k$N$O$I$&$G$7$g$&$+!#e(B

e$B;?@.$G$9!#e(BTLSe$B!Je(Bthread local  
storagee$B!K$O$3$NMQES0J30$G$N@5$7$$;HMQK!$r;We(B  
e$B$$$D$-$^$;$s!JH?O@Jg=8!K!#$N$G!“@5$7$$;HMQK!$r;H$$$d$9$/$9$k$N$K;?@.$7$^e(B  
e$B$9!#$^$?Ds0F$Ne(BAPIe$B$b!“e(BRubye$B$Ne(Bblock +  
ensuree$B%Q%?!\<%s$rA[5/$5$;!”!V85$KLa$ke(B  
e$B$s$@$h!W46$,$”$C$F$h$$$H;W$$$^$9!#e(B

> > e$B$?$H$($Pe(B Thread#bind(sym, val) { … } e$B$H$7$F!“e(B  
> > e$B%V%m%C%/$r8F$S=P$7$F$$$k$”$$$@!“%9%l%C%IJQ?te(B sym e$B$re(B  
> > val e$B$K@\_Dj$9$k!”$H$$$&$h$&$J$b$N$G$9!#e(B

e$B$,!“Kh2se(B”.current."e$B$r=q$/$N$,%$%^%$%A$+$J!\<!#e(BThread.currente$B0J30$Ne(BTLSe$B$C$Fe(B  
e$B;H$o$J$$$G$9$h$M!#$7$+$7$h$$e(BAPIe$B$r;W$$$D$-$^$;$s!#!#!#C/$+!#e(B

> > e$B$^$?!“e(BThread e$B$8$c$J$/$Fe(B Fiber e$B$8$c$J$$$+!”$H$$$&OC$O$"$k$+$b$7$l$^$;$s!#e(B
> 
> Fibere$B$,$$$$$J$!!&!&!&!&e(B

Fibere$B$h$/$o$+$i$J$$!#!#!#e(B

> e$B$=$l$O$=$l$H$7$F!“%a%=%C%I$G$d$k$h$j$b%9%l%C%I%m!\<%+%kJQ?t$r@k8@$9$ke(B  
> e$B9=J8$D$/$C$?$[$&$,$&$l$7$$$h$&$J5$$,$A$g$C$H$@$1$7$^$9!#e(B  
> e$B$?$+$,JQ?t#1$D$N$?$a$K!”%$%s%G%s%H$,0lCJ?\<$/$J$k$H$$$&$N$,$I$&$K$b!&!&!&e(B

e$B$[$H$s$I$,e(B

Thread.current.bind(:a, 100) do  
do\_tls\_depending\_work  
end

e$B$H$+$J$N$G!"$$$$$s$8$c$J$$$G$7$g$&$+!#e(BTLSe$B;H$&$h$&$J=hM}$Oe(Binlinee$B$8$c=q$1e(B  
e$B$J$$$G$7$g$&!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 30, 2010, 9:25am UTC](https://www.ruby-forum.com/t/thread-bind-sym-val/192379/4 "2010-07-30T09:25:50Z")

</div>

e$B$I$A$i$+$H$$$&$H;?@.$G$9!#e(B

(2010/07/30 7:32), Yukihiro M. wrote:

> |e$B%9%l%C%IJQ?t$O$3$N$h$&$J;H$$J}$,B?$$$N$G!"%a%=%C%I$,$"$C$F$b$$$$e(B  
> |e$B$h$&$K;W$$$^$9!#e(B
> 
> e$BB?$$$s$G$9$+!#8D?ME\*$K$O%9%l%C%IJQ?t$O%9%l%C%I%9%3!\<%W$N%0%m!\<e(B  
> e$B%P%kJQ?t$H$7$F$@$1;H$$!"%9%3!\<%W$N$"$k$h$&$J;H$$J}$N7P83$O$Je(B  
> e$B$$$s$G$9$,!#e(B

Rubye$B$Ge(BTLSe$B$r;H$&$H$$$C$F;W$$=P$9$N$Oe(Binspecte$B$de(Bpretty\_inspecte$B$Ne(Brecursion  
check  
e$B$G!"$3$&$$$C$?$b$N$O$^$5$K%9%3!\<%W$N$"$k;H$$J}$@$H;W$$$^$9!#e(B

e$B$^$“e(Binspecte$B$Ne(B…e$B$r=P$9$N$,K\Ev$Ke(BTLSe$B$rMQ$$$F\<B8=$5$l$k$Y$-$+$K$O5DO@$,$”$k$H$3e(B  
e$B$m$@$H;W$$$^$9$,!"$=$l$O$=$l$H$7$F%9%3!\<%W$N%K!\<%:\<+BN$O$"$k$N$G!"$3$N5!G=$Oe(B  
e$B$"$C$F$b$$$$$+$J$"$H;W$$$^$9!#;d$N7P83$H$7$F$O$+$D$Fe(Bmethod\_missinge$B$NCf$GFH\<+$Ke(B  
e$B%a%=%C%I%G%#%9%Q%C%A$r$7$h$&$H$7$?$H$-$K!“e(Bmethod\_missinge$B$,L58B:F5”$K$J$k$N$rH/e(B  
e$B8+$9$kMQES$G;w$?$h$&$J;H$$J}$r$7$^$7$?!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 30, 2010, 12:32am UTC](https://www.ruby-forum.com/t/thread-bind-sym-val/192379/5 "2010-07-30T00:32:36Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:41893] thread.bind(sym, val) { … }”  
on Thu, 29 Jul 2010 18:40:43 +0900, Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|e$B%9%l%C%IJQ?t$r0l;~E\*$K@\_Dj$9$k%a%=%C%I$r2C$($k$N$O$I$&$G$7$g$&$+!#e(B  
|  
|e$B$?$H$($Pe(B Thread#bind(sym, val) { … } e$B$H$7$F!“e(B  
|e$B%V%m%C%/$r8F$S=P$7$F$$$k$”$$$@!“%9%l%C%IJQ?te(B sym e$B$re(B  
|val e$B$K@\_Dj$9$k!”$H$$$&$h$&$J$b$N$G$9!#e(B  
|  
| p Thread.current[:a] # nil  
| Thread.current.bind(:a, 100) {  
| p Thread.current[:a] # 100  
| }  
| p Thread.current[:a] # nil e$B$KLa$ke(B  
|  
|e$B%9%l%C%IJQ?t$O$3$N$h$&$J;H$$J}$,B?$$$N$G!“%a%=%C%I$,$”$C$F$b$$$$e(B  
|e$B$h$&$K;W$$$^$9!#e(B

e$BB?$$$s$G$9$+!#8D?ME\*$K$O%9%l%C%IJQ?t$O%9%l%C%I%9%3!\<%W$N%0%m!\<e(B  
e$B%P%kJQ?t$H$7$F$@$1;H$$!“%9%3!\<%W$N$”$k$h$&$J;H$$J}$N7P83$O$Je(B  
e$B$$$s$G$9$,!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 30, 2010, 9:36am UTC](https://www.ruby-forum.com/t/thread-bind-sym-val/192379/6 "2010-07-30T09:36:57Z")

</div>

2010e$BG/e(B7e$B7ne(B30e$BF|e(B7:32 Yukihiro M.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$BB?$$$s$G$9$+!#8D?ME\*$K$O%9%l%C%IJQ?t$O%9%l%C%I%9%3!\<%W$N%0%m!\<e(B  
> e$B%P%kJQ?t$H$7$F$@$1;H$$!“%9%3!\<%W$N$”$k$h$&$J;H$$J}$N7P83$O$Je(B  
> e$B$$$s$G$9$,!#e(B

e$B$&$%$`!“D4$YD\>$7$F$\_$k$H!”$?$7$+$K$=$s$J$KB?$/$J$$$N$+$b$7$l$^$;$s!#e(B

e$BC5$7$F$\_$k$H0J2\<$/$i$$$,8+$D$+$j$^$9!#e(B

- lib/webrick/server.rb e$B$Ne(B Thread.current[:WEBrickSocket]
- lib/drb/drb.rb e$B$Ne(B Thread.current[:drb\_untaint]
- ext/pathname/lib/pathname.rb e$B$Ne(B  
Thread.current[:pathname\_sub\_matchdata]

pp (e$B$de(B inspect)  
e$B$G$O!“%9%l%C%IJQ?t$=$l\<+BN$O0l2s@\_Dj$7$?$iJQ$($^$;$s$M!#e(B  
e$BJQ99!&2sI|$O@\_Dj$7$?%O%C%7%e$NCf?H$KBP$7$F9T$&$N$G!”$=$l$Oe(B  
Thread#bind e$B$Ge(B  
e$BBP1~$9$k$b$N$G$O$J$5$=$&$G$9!#e(B

e$BDs0FA0$KD4$YD\>$7$F$\_$k$Y$-$@$C$?$+!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 30, 2010, 11:12am UTC](https://www.ruby-forum.com/t/thread-bind-sym-val/192379/7 "2010-07-30T11:12:59Z")

</div>

2010/7/30 Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > e$BB?$$$s$G$9$+!#8D?ME\*$K$O%9%l%C%IJQ?t$O%9%l%C%I%9%3!\<%W$N%0%m!\<e(B  
> > e$B%P%kJQ?t$H$7$F$@$1;H$$!“%9%3!\<%W$N$”$k$h$&$J;H$$J}$N7P83$O$Je(B  
> > e$B$$$s$G$9$,!#e(B
> 
> e$B$&$%$`!“D4$YD\>$7$F$\_$k$H!”$?$7$+$K$=$s$J$KB?$/$J$$$N$+$b$7$l$^$;$s!#e(B

e$B0l1~!“$=$&$$$&;H$$J}$NNc$r!#e(B  
[http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby\_1\_8/lib/soap/mapping/mapping.rb?view=markup](http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/lib/soap/mapping/mapping.rb?view=markup)  
e$B$N!“2\<$N$[$&$K$”$ke(Bprotect\_threadvarse$B$,Dj5A$G!”\>e$N$[$&$KMxMQNc$,$“$j$^e(B  
e$B$9!#e(Bobj2soape$B!“e(Bsoap2obje$B6&$K:F5”$9$k$N$G!”%9%3!\<%W$r:n$j$^$9!#e(B

> pp (e$B$de(B inspect) e$B$G$O!"%9%l%C%IJQ?t$=$l\<+BN$O0l2s@\_Dj$7$?$iJQ$($^$;$s$M!#e(B  
> e$BJQ99!&2sI|$O@\_Dj$7$?%O%C%7%e$NCf?H$KBP$7$F9T$&$N$G!"e(B

Threade$B%$%s%9%?%s%9$,;H$$\<N$F$N$3$H$,B?$/!“%0%m!\<%P%kJQ?tE\*$K;H$C$F$b5$$Ke(B  
e$B$J$i$J$$!”$H$$$&$3$H$O$“$k$+$b$7$l$^$;$s!#:F5”$;$:!"L\>A0\>WFM$,L5$1$l$P0Ue(B  
e$BL#$J$$$7!#e(B

> e$B$=$l$Oe(B Thread#bind e$B$Ge(B  
> e$BBP1~$9$k$b$N$G$O$J$5$=$&$G$9!#e(B

Hashe$BE\*$J$b$N$X$NBeF~$G%9%3!\<%W$N$h$&$J;H$$J}!"$HHFMQ2=$9$l$P$h$$!)e(B  
let(Thread.current, :sym =\> var) {}  
e$B$H$+!#e(B
