gpt4 book ai didi

ruby 线程#allocate TypeError

转载 作者:数据小太阳 更新时间:2023-10-29 08:09:10 31 4
gpt4 key购买 nike

我正在详细查看 Thread 类。基本上,我一直在寻找一种优雅的机制,以允许在创建线程时继承线程局部变量。例如,我希望创建的功能将确保

Thread.new do
self[:foo]="bar"
t1=Thread.new { puts self[:foo] }
end

=> "酒吧"

即线程将继承它正在调用线程的线程局部变量

所以我想到重新定义 Thread.new,这样我就可以添加一个额外的步骤,将线程局部变量从当前线程复制到新线程中。像这样:

class Thread
def self.another_new(*args)
o=allocate
o.send(:initialize, *args)
Thread.current.keys.each{ |k| o[k]=Thread.current[k] }
o
end
end

但是当我尝试这样做时,出现以下错误:

:in `allocate': allocator undefined for Thread (TypeError)

我认为 Thread 是 Object 的子类,它应该有一个有效的 #allocate 方法。不是这样吗?

有没有人对此有深入的了解,以及如何实现我正在寻找的功能。

提前致谢

史蒂夫

最佳答案

Thread.new do
Thread.current[:foo]="bar"
t1=Thread.new(Thread.current) do |parent|
puts parent[:foo] ? parent[:foo] : 'nothing'
end.join
end.join

#=> bar

更新:

在 irb 中试试这个:

thread_ext.rb

class Thread
def self.another_new(*args)
parent = Thread.current
a = Thread.new(parent) do |parent|
parent.keys.each{ |k| Thread.current[k] = parent[k] }
yield
end
a
end
end

用例.rb

A = Thread.new do
Thread.current[:local_a]="A"
B1 =Thread.another_new do
C1 = Thread.another_new{p Thread.current[:local_a] }.join
end

B2 =Thread.another_new do
C2 = Thread.another_new{p Thread.current[:local_a] }.join
end

[B1, B2].each{|b| b.join }
end.join

输出

"A"
"A"

关于 ruby 线程#allocate TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19163413/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com