From: naruse@... Date: 2016-09-07T07:40:31+00:00 Subject: [ruby-core:77187] [Ruby trunk Bug#12689] Thread isolation of $~ and $_ Issue #12689 has been updated by Yui NARUSE. ```ruby % ruby -e 'P = proc {|s| p [s, $~]; sleep 1; /foo.*/=~s; sleep 1; p [s,$~] }; def foo; Thread.new{P.call("foobar")}; sleep 0.2; Thread.new{P.call("foo")}; end; foo;sleep 5' ["foobar", nil] ["foo", nil] ["foobar", #] ["foo", #] % ruby -e 'P = proc {|s| p [s, $~]; sleep 1; /foo.*/=~s; sleep 1; p [s,$~] }; Thread.new{P.call("foobar")}; sleep 0.2; Thread.new{P.call("foo")}; sleep 5' ["foobar", nil] ["foo", nil] ["foobar", #] ["foo", #] ``` ---------------------------------------- Bug #12689: Thread isolation of $~ and $_ https://bugs.ruby-lang.org/issues/12689#change-60402 * Author: Charles Nutter * Status: Open * Priority: Normal * Assignee: * ruby -v: * Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN ---------------------------------------- We are debating what is correct behavior now, and what should be correct behavior in the future, for the thread-visibility of the special variables `%~` and `$_` We have several examples from https://github.com/jruby/jruby/issues/3031 that seem to exhibit conflicting behavior...or at least the behavior is unexpected in many cases. ``` $ ruby23 -e 'p = proc { p $~; "foo" =~ /foo/ }; Thread.new {p.call}.join; Thread.new{p.call}.join' nil nil $ ruby23 -e 'def foo; proc { p $~; "foo" =~ /foo/ }; end; p = foo; Thread.new {p.call}.join; Thread.new{p.call}.join' nil # $ ruby23 -e 'p = proc { p $~; "foo" =~ /foo/ }; def foo(p); Thread.new {p.call}.join; Thread.new{p.call}.join; end; foo(p)' nil # $ ruby23 -e 'class Foo; P = proc { p $~; "foo" =~ /foo/ }; def foo; Thread.new {P.call}.join; Thread.new{P.call}.join; end; end; Foo.new.foo' nil # $ ruby23 -e 'def foo; p = proc { p $~; "foo" =~ /foo/ }; Thread.new {p.call}.join; Thread.new{p.call}.join; end; foo' nil nil $ ruby23 -e 'def foo; p = proc { p $~; "foo" =~ /foo/ }; bar(p); end; def bar(p); Thread.new {p.call}.join; Thread.new{p.call}.join; end; foo' nil # ``` These cases exhibit some oddities in whether $~ (and presumably $_) are shared across threads. The immediate thought is that they should be both frame and thread-local...but ko1 points out that such a change would break cases like this: ``` def foo /foo/ =~ 'foo' Proc.new{ p $~ } end Thread.new{ foo.call }.join ``` So there's a clear conflict here. Users sometimes expect the $~ value to be shared across threads (at least for read, as in ko1's example) and sometimes do not want it shared at all (as in the case of https://github.com/jruby/jruby/issues/3031 Now we discuss. -- https://bugs.ruby-lang.org/ Unsubscribe: